从先序中序重建二叉树输出层序后序
来源:互联网 发布:anaconda带python吗 编辑:程序博客网 时间:2024/04/30 00:33
标题:从先序中序重建二叉树输出层序后序时 限:5000 ms内存限制:20000 K总时限:3000 ms描述:输入:
由树的先序和中序遍历生成树的层序遍历后序遍历
给定一个树的先序和中序的遍历结果,构建一棵树,并输出这个棵树的层序遍历和后序遍历结果
注:这棵树的结点是由整数描述树结点总数m
先序输出序列
中序输出序列输出:层序输出序列
后续输出序列输入样例:10
1 2 5 10 3 6 13 7 14 15
2 10 5 1 6 13 3 14 7 15输出样例:1 2 3 5 6 7 10 13 14 15
10 5 2 13 6 14 15 7 3 1提示:先序遍历的第一个输出是根结点//编译环境G++#include <stdio.h>#include <stdlib.h>//////////////TreeNode///////////////////////////////////////////typedef struct _TreeNode{ //char key; int key; struct _TreeNode *Lc; struct _TreeNode *Rc;}TreeNode;////Queue////////////////////////////////////////////////////////////////////队列结点typedef struct _QNode{ TreeNode *treenode; struct _QNode *next;}QNode;//队列typedef struct _Queue{ QNode *front; QNode *rear;}Queue;void InitQueue(Queue &Q){ Q.front=NULL; Q.rear=NULL;}bool isemptyQ(Queue &Q){ if(Q.front==NULL) return 1; return 0;}void EnQueue(Queue &Q,TreeNode *_treenode){ QNode *s=(QNode*)malloc(sizeof(QNode)); s->treenode=_treenode; s->next=NULL; if(isemptyQ(Q)) { Q.front=s; Q.rear=s; return; } else { Q.rear->next=s; Q.rear=s; }}bool DeQueue(Queue &Q,TreeNode *&treenode){ if(isemptyQ(Q)) return false; else { QNode *node=Q.front; treenode=node->treenode; Q.front=node->next; if(Q.front==NULL) { Q.rear=NULL; } free(node); } return true;}void DestroyQueue(Queue &Q){ TreeNode *temp; while(DeQueue(Q,temp)){}}int Position(int *array, int e, int len)//确定e在数组in中的位置{ int pos=0; while(array[pos]!=e) { pos++; if(pos>len-1) { return -1; } } return pos;}//i: 子树的前序序列字符串的首字符在pre[]中的下标//j: 子树的中序序列字符串的首字符在mid[]中的下标//len: 子树的字符串序列的长度void PreMidCreatTree(TreeNode* &T,int *pre, int *in,int i, int j,int len,int midlength){ if(len<=0) return; T=(TreeNode*)malloc(sizeof(TreeNode)); T->key=pre[i]; T->Lc=NULL; T->Rc=NULL; int m=Position(in,pre[i],midlength); //printf("%d\n",m); PreMidCreatTree(T->Lc,pre,in,i+1,j,m-j,midlength); PreMidCreatTree(T->Rc,pre,in,i+(m-j)+1,m+1,len-1-(m-j),midlength);}int RePostOrder(TreeNode *T){ if(T) { RePostOrder(T->Lc); RePostOrder(T->Rc); printf("%d ",T->key); } return 0;}//层序遍历,利用队列void LevelTravserse(TreeNode *T){ Queue Q; InitQueue(Q); //EnQueue(Q,T); if(T!=NULL) { EnQueue(Q,T); while(!isemptyQ(Q)) { TreeNode *currentTreeNode; DeQueue(Q,currentTreeNode); if(currentTreeNode->Lc!=NULL) { EnQueue(Q,currentTreeNode->Lc); } if(currentTreeNode->Rc!=NULL) { EnQueue(Q,currentTreeNode->Rc); } printf("%d ",currentTreeNode->key); } } DestroyQueue(Q);}int main(){int len;scanf("%d",&len);int *pre=(int*)malloc(sizeof(int)*len);int *in=(int*)malloc(sizeof(int)*len);int i;for(i=0;i<len;i++){ scanf("%d",&pre[i]);}for(i=0;i<len;i++){ scanf("%d",&in[i]);}TreeNode *newnode;PreMidCreatTree(newnode,pre,in,0,0,len,len);LevelTravserse(newnode);printf("\n");RePostOrder(newnode);}
- 从先序中序重建二叉树输出层序后序
- 从先序遍历和中序遍历重建二叉树
- 从先序遍历和中序遍历结果重建二叉树
- java-从先序遍历和中序遍历重建二叉树
- java-从先序遍历和中序遍历重建二叉树
- Construct Binary Tree from Preorder and Inorder Traversal 从先序和中序重建二叉树@LeetCode
- 从层序中序重建二叉树输出先序后序
- 3.9重建二叉树
- 重建二叉树
- 二叉树重建
- 二叉树重建
- 二叉树的重建
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- android基础--log的处理
- growcut分割方法的mex代码
- android googlemap的location报空指针解决案例
- 【杂乱的生活】50条经典心理定律,教你看透人心!
- android基础--activity的使用
- 从先序中序重建二叉树输出层序后序
- C++泛型
- android基础--activity基础
- Matlab7 runtime error 解决方案集合
- Bug分析与单元测试 (2)
- 世界上有哪些优秀的grid组件??(征集ing...)
- android--service和broadcastReceiver基础
- flashdevelop工程调用android方法
- httplib2---python下的http请求终结者