输入前序/后序+中序 遍历结果重建二叉树(递归)

来源:互联网 发布:翼支付企业版下载软件 编辑:程序博客网 时间:2024/06/02 05:44

给定二叉树的前序遍历和中序遍历结果,或者后序遍历和中序遍历结果(必须得有中序遍历),能唯一确定一棵二叉树,那么如何利用程序重建这棵二叉树呢?


情形一:输入前序遍历,中序遍历,重建二叉树

//输入前序 中序遍历结果,调用重建,返回根结点指针赋给rootvoid BinaryTree::pCreateBinaryTree(){    cout<<"请输入前序遍历结果:";    char A[Max],B[Max];    int i=0,n;    while((A[i]=cin.get())!='\n')i++;    n=i;    cout<<endl<<"请输入中序遍历结果:";    for(i=0;i<n;i++)        cin>>B[i];    root=pCreateBinaryTree(A,B,n);    cout<<endl<<"重建二叉树成功。"<<endl;}Node* BinaryTree::pCreateBinaryTree(char *pre,char *in,int n)//按前序 中序遍历结果重建二叉树,返回根结点指针//pre是前序遍历结果,in是中序遍历结果,n表示处理的树结点个数,返回二叉树的根结点指针{    if(n==0) return NULL;                      //结点数为0,不处理,返回空,即上一轮处理的是叶节点    int k=0;    while(pre[0]!=in[k]) k++;                 //找到前序遍历中根结点在中序遍历的下标k,即左边k个元素是左子树                                               //右边n(n-k-1)个元素是右子树    Node *p=new Node( pre[0] );                //创建根结点,同时赋值    p->lchild=pCreateBinaryTree(pre+1,in,k);   //从前序MTR+1开始对中序LMR的0~k-1 共k个元素递归处理建立左子树    p->rchild=pCreateBinaryTree(pre+k+1,in+k+1,n-(k+1));    //从前序MTR[k+1]个元素开始对中序的k+1~n-1右子序列的n-k-1个元素递归建立右子树    return p;}

情形二:输入后序遍历,中序遍历,重建二叉树

//输入后序遍历 中序遍历结果,重建二叉树,返回根节点指针,赋给rootvoid BinaryTree::lCreateBinaryTree(){    char ch;    ch=cin.get();             //cin不接受回车符,故上一次输入的回车符仍在输入流中,用ch接收"除去"该回车符    char A[Max],B[Max],C[Max];    int i=0,j,n;    cout<<"请输入后序遍历结果:";    while((A[i]=cin.get())!='\n') i++;    n=i;    cout<<"请输入中序遍历结果:";    for(i=0;i<n;i++)        cin>>B[i];    for(i=n-1,j=0;i>=0;i--,j++) C[j]=A[i];                    //将后序遍历结果倒序得到C 传入重建函数中    root=lCreateBinaryTree(C,B,n);}//按后序 中序遍历结果重建二叉树,返回根结点指针,赋给rootNode * BinaryTree::lCreateBinaryTree(char *post,char *in,int n){    if(n==0) return NULL;    int k=0;    while(post[0]!=in[k]) k++;    Node *p=new Node(post[0]);    p->lchild=lCreateBinaryTree(post+n-k,in,k);    p->rchild=lCreateBinaryTree(post+1,in+k+1,n-k-1);    return p;}



0 0
原创粉丝点击