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

描述

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

输入

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

输出

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

输入样例 1 

ACBDFEG
ABDCGEF

输出样例 1

FCADBEG

代码

#include 
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(flagr); \\知后序序列从右往左构建树
    if(flag>l) buildtree(l,flag-1,t,root->l);
}
 
void xiantravel(point * root) \\先序遍历
{
    if(root!=NULL)
    {
        cout<mb;
        xiantravel(root->l);
        xiantravel(root->r);
    }
}
 
void zhongtravel(point * root)  \\中序遍历
{
    if(root!=NULL)
    {
        zhongtravel(root->l);
        cout<mb;
        zhongtravel(root->r);
    }
}
 
void houtravel(point * root)  \\后序遍历
{
    if(root!=NULL)
    {
        houtravel(root->l);
        houtravel(root->r);
        cout<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<

 

你可能感兴趣的:(例题,二叉树,数据结构,c++)