【王道例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;
}

猜你喜欢

转载自www.cnblogs.com/wwj321/p/12362679.html