从层序中序重建二叉树输出先序后序
来源:互联网 发布:数据库锁的特性 编辑:程序博客网 时间:2024/05/17 01:19
标题:由二叉树的中序层序重建二叉树时 限:1000 ms内存限制:10000 K总时限:3000 ms描述:
给定一棵二叉树的中序和层序输出,生成这棵树并按先序和后序输出
其中树结构中结点信息为整数输入:树结点个数
层序输出序列
中序输入序列
输出:先序遍历
后序遍历输入样例:6
1 2 3 5 6 7
2 5 1 6 3 7输出样例:1 2 5 3 6 7
5 2 6 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 _QElement{int lvl;//指向当前根节点在层次序列中的位置int l,h;//中序序列的上、下界TreeNode *f;//层次序列中当前根节点的双亲节点指针int lr;// 指示符,0:根结点,1:双亲的左子树,2:双亲的右子树}QElement;//队列节点typedef struct _QNode{QElement data;struct _QNode *next;}QNode;//队列typedef struct _Queue{QNode *front;QNode *rear;}Queue;void InitQueue(Queue &Q){Q.front=Q.rear=(QNode*)malloc(sizeof(QNode));if(!Q.front) exit(0);Q.front->next=NULL;//Q.front->next=Q.rear->next=NULL;//Q.front=NULL;//Q.rear=NULL;}bool isemptyQ(Queue &Q){//if(Q.front==NULL)if(Q.front==Q.rear)return 1;return 0;}void EnQueue(Queue &Q,QElement e){QNode *p;p=(QNode*)malloc(sizeof(QNode));if(!p) exit(0);p->data=e;p->next=NULL;Q.rear->next=p;Q.rear=p;}void DeQueue(Queue &Q,QElement &e){QNode* p;if(Q.front==Q.rear)exit(0);p=Q.front->next;e=p->data;Q.front->next=p->next;if(Q.rear==p)Q.rear=Q.front;free(p);}int RepreOrder(TreeNode *T){//TreeNode *p=T;if(T){printf("%d ",T->key);RepreOrder(T->Lc);RepreOrder(T->Rc);}return 0;}int RePostOrder(TreeNode *T){if(T){RePostOrder(T->Lc);RePostOrder(T->Rc);printf("%d ",T->key);}return 0;}//参考了http://www.cnblogs.com/xiaofengkang/archive/2011/05/22/2053493.htmlTreeNode* CreatFromLevelIn(int *level,int *in, int n){int r=-1,low,high,lr,i,j;TreeNode *root=NULL,*p,*father;int ch;QElement s;Queue Q;InitQueue(Q);s.lvl=level[++r];s.l=0;s.h=n-1;s.f=NULL;s.lr=0;EnQueue(Q,s);while(!isemptyQ(Q)){DeQueue(Q,s);ch=s.lvl;low=s.l;high=s.h;father=s.f;lr=s.lr;for(j=low;j<=high;j++){if(in[j]==ch){i=j;//printf("i=%d\n",i);//system("pause");break;}}//forp=(TreeNode*)malloc(sizeof(TreeNode));p->key=ch;p->Lc=p->Rc=NULL;if(lr==0) root=p;else if(lr==1) father->Lc=p;else father->Rc=p;if(low==high) continue;//跳出本次for循环if(i==low)//无左子树{s.l=low+1;s.lr=2;s.lvl=level[++r];s.f=p;EnQueue(Q,s);}else if(i==high)//无右子树{s.h=high-1;s.lr=1;s.lvl=level[++r];s.f=p;EnQueue(Q,s);}else{s.h=i-1;s.l=low;s.lr=1;s.lvl=level[++r];s.f=p;EnQueue(Q,s);s.l=i+1;s.h=high;s.lr=2;s.lvl=level[++r];s.f=p;EnQueue(Q,s);}//else}//whilereturn root;}//CreatFromLevelInint main(){int len;scanf("%d",&len);int *level=(int*)malloc(sizeof(int)*len);int *in=(int*)malloc(sizeof(int)*len);int i;for(i=0;i<len;i++){scanf("%d",level+i);}for(i=0;i<len;i++){scanf("%d",in+i);}TreeNode *newnode=(TreeNode*)malloc(sizeof(TreeNode));newnode=CreatFromLevelIn(level,in,len);RepreOrder(newnode);printf("\n");RePostOrder(newnode);return 0;}
- 从层序中序重建二叉树输出先序后序
- 从先序中序重建二叉树输出层序后序
- 3.9重建二叉树
- 重建二叉树
- 二叉树重建
- 二叉树重建
- 二叉树的重建
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 二叉树重建
- 二叉树重建
- 重建二叉树
- 打开文件对话框和文件夹对话框之MFC和API实现。
- 编程感悟
- GDB具体调试命令
- 微软企业库--Policy包含多个MatchingRule
- HDU-1875 最小生成树 PRIM
- 从层序中序重建二叉树输出先序后序
- MyEclipse中删除添加的Hibernate Capabilities
- 关于在C#中使用MailMessage发邮件后附件被锁定的问题
- jdbc
- Test
- Android 解析XML
- 非均匀有理样条NURBS
- SQL Server修改标识列方法 如自增列的批量化修改
- 深入浅出说流水线