王道例3.4通过二叉树遍历结果建立二叉树

Posted wwj321

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了王道例3.4通过二叉树遍历结果建立二叉树相关的知识,希望对你有一定的参考价值。

题目

技术图片

思路

根据先序遍历可以知道第一个字符一定是根节点,然后在中序遍历中,找到对应的根节点,则其左边的字母组成了左子树,右边的字母组成了右子树。
例如示例中:
技术图片

代码

#include<bits/stdc++.h> 
using namespace std;
typedef struct BiNode{
    struct BiNode *lchild;
    struct BiNode *rchild;
    char data;
}*BiTree;
string s1,s2;      //s1存储前序遍历,s2存储中序遍历 
int cen=0; 

//分析s2 p~q段,s1 a~b段 建立二叉树T
void BuildTree(BiTree &T,int p,int q,int a,int b)
{
    T=(BiTree)malloc(sizeof(BiNode));
    T->data=s1[a];                      //先序第一个一定为此时的根节点
    T->lchild=T->rchild=NULL;
    
    int loc;
    for(int i=p;i<=q;i++)              //找出跟结点在中序遍历的位置,将左右子树隔开
    {
        if(T->data==s2[i])
        {
            loc=i;
            break;
        }
    }
    if(loc!=p)       //左子树存在
    {
        BuildTree(T->lchild,p,loc-1,a+1,a+(loc-p));      //loc-p为左边字符串的宽度
    } 
    if(loc!=q)      //右子树存在 
    {
        BuildTree(T->rchild,loc+1,q,a+(loc-p)+1,b);
    }
}

void PostOrderTraverse(BiTree T)
{
    if(!T)
        return;
    else if(T!=NULL)
    {
        if(T->lchild!=NULL)
        PostOrderTraverse(T->lchild);
        if(T->rchild!=NULL)
        PostOrderTraverse(T->rchild);
        
        cout<<(T->data);
    }
}
int main()
{
    int p,q,loc;
    cin>>s1>>s2;
    BiTree T;
    /*T=(BiTree) malloc(sizeof(BiNode));
    T->data=s1[0];
    */

    p=0;
    q=s2.size();
    BuildTree(T,p,q-1,p,q-1);      //p为第一个字母下标,q为最后一个
    PostOrderTraverse(T);
    cout<<endl;
    return 0;
}

以上是关于王道例3.4通过二叉树遍历结果建立二叉树的主要内容,如果未能解决你的问题,请参考以下文章

二叉树的建立与遍历 两天之内就要,急用!!!!

结队审查

二叉树遍历(王道)

根据二叉树的先序遍历结果输出中序遍历

(王道408考研数据结构)第五章树-第三节2:二叉树构造和重建

数据结构-王道2017-第4章 树与二叉树-二叉树的遍历