中、后序遍历求前序遍历(图论--树)

描述

给出一个二叉树的中序遍历和后序遍历,求出二叉树的前序遍历

输入

共两行,第一行为二叉树的中序遍历,第二行为后序遍历,字符串为大写字母,长度不超过26字符,每个字符表示一个节点

输出

只有一行,为树的前序遍历

输入样例 1 

ACBDFEG
ABDCGEF

输出样例 1

FCADBEG

代码

#include <bits/stdc++.h>
using namespace std;
const int M=30;
char xian[M],zhong[M],hou[M];

struct point
{
    char mb;
    point *l,*r;
    point (char mb='0',point *l=NULL,point *r=NULL)
    {
        this->mb=mb;
        this->l=l;
        this->r=r;
    }
};
 
void buildtree(int l,int r,int &t,point* &root)  \\建树函数
{
    int flag=-1;
    for(int i=l; i<=r; i++)
    {
        if(zhong[i]==hou[t])  \\找到根结点在中序序列中的位置
        {
            flag=i;
            break;
        }
    }
    if(flag==-1) return;
    root=new point(hou[t]);
    t--;  \\得到新的根结点在数组中的下标
    if(flag<r) buildtree(flag+1,r,t,root->r); \\知后序序列从右往左构建树
    if(flag>l) buildtree(l,flag-1,t,root->l);
}
 
void xiantravel(point * root) \\先序遍历
{
    if(root!=NULL)
    {
        cout<<root->mb;
        xiantravel(root->l);
        xiantravel(root->r);
    }
}
 
void zhongtravel(point * root)  \\中序遍历
{
    if(root!=NULL)
    {
        zhongtravel(root->l);
        cout<<root->mb;
        zhongtravel(root->r);
    }
}
 
void houtravel(point * root)  \\后序遍历
{
    if(root!=NULL)
    {
        houtravel(root->l);
        houtravel(root->r);
        cout<<root->mb;
    }
}
 
void delete_tree(point *root)  \\删除new开辟的空间
{
    if(root==NULL) return;
    delete_tree(root->r);
    delete_tree(root->l);
    delete root;
}
 
int main()
{
    cin>>zhong>>hou;
    int n=strlen(hou);
    point *root;
    int t=n-1;  \\后序序列中根结点在尾部
    buildtree(0,n-1,t,root);
    xiantravel(root);
    cout<<endl;
    delete_tree(root);  \\删不删无所谓
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值