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

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

 

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

 

//输入前序 中序遍历结果,调用重建,返回根结点指针赋给root
void 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;
}


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

 

 

//输入后序遍历 中序遍历结果,重建二叉树,返回根节点指针,赋给root
void 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);
}
//按后序 中序遍历结果重建二叉树,返回根结点指针,赋给root
Node * 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;
}

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值