中序后序先序

来源:互联网 发布:防御矩阵 觉醒 编辑:程序博客网 时间:2024/05/22 09:02
/*要想由这三种遍历二叉树的序列重建唯一的二叉树则至少得有两种遍历序列,且这两种中一定要有中序序列,也就是先序+中序-->二叉树  或者  后序+中序-->二叉树,而先序+中序得不到唯一的二叉树。*/#include <stdio.h>#include <malloc.h>#include <string.h>//二叉链表typedef struct node{char data;//节点数据元素struct node *lchild;//指向左孩子struct node *rchild;//指向右孩子}BiNode,*BTree;//利用后序和中序建立二叉树void GetPreOrder(char *last,char *mid,BTree &T,int len){if(len==0){T = NULL;return;}//取出后序序列中的最后一个节点char ch=last[len-1];int index=0;//在中序序列中进行查找根节点,并用index记录其在序列中的索引while(mid[index]!=ch){index++;}//给根节点分配空间T=(BTree)malloc(sizeof(BiNode));T->data=mid[index];//建立左子树GetPreOrder(last,mid,T->lchild,index);//建立右子树GetPreOrder(last+index,mid+index+1,T->rchild,len-index-1);}//先序中序 输出后序void GetPostOrder(char *prim,char *mid,BTree &T,int len){if(len==0){T=NULL;return;}//提出先序序列中的第一个节点char ch=prim[0];int index=0;//在中序序列中查找当前根节点,并用index记录其在序列中的位置while(mid[index]!=ch){index++;}//给根节点分配空间T=(BTree)malloc(sizeof(BiNode));T->data=mid[index];//建立左子树GetPostOrder(prim+1,mid,T->lchild,index);//建立右子树GetPostOrder(prim+index+1,mid+index+1,T->rchild,len-index-1);}//先序输出二叉树void PreOrder(BTree T){if(T!=NULL){printf("%c",T->data);PreOrder(T->lchild);PreOrder(T->rchild);}}//后序输出二叉树void PostOrder(BTree T){if(T!=NULL){PostOrder(T->lchild);PostOrder(T->rchild);printf("%c",T->data);}}int main(){char first[26],mid[26],last[26];while(scanf("%s%s",last,mid)!=EOF){BTree T=NULL;GetPreOrder(last,mid,T,strlen(last));PreOrder(T);// GetPostOrder(last,mid,T,strlen(last));// PostOrder(T);printf("\n");}return 0;}


0 0
原创粉丝点击