您的位置:首页 > 产品设计 > UI/UE

【暂无】 二叉树 根据遍历结果建立二叉树(build-tree.cpp)

2016-10-02 11:45 691 查看
根据两种遍历顺序确定树结构(build-tree)

题目描述

输入

第1行:二叉树的前序遍历顺序第2行:中序遍历顺序

输出

二叉树的后序遍历顺序

样例输入

ABCDEFGH

CBEDAGHF

样例输出

CEDBHGFA

    初次看到这道题,表示我一脸懵逼——这太难了吧!在纸上模拟都很困难!不过,仔细一想也没什么,先序遍历的第一个字母A就是整棵树的根节点,在中序遍历中把树分成两半,左边是左子树,右边是右子树,然后字母B又是左子树的根节点,字母C又是左子树的左子树的根节点……这样递归分成两半(左子树和右子树)即可,但是由于是字母,必须用结构体数组保存坐标,还需要放在合适的位置,需要细细的思考,那么以下就是AC代码啦:

#include<cstdio>
#include<cstring>
using namespace std;
struct Tree
{
int f;
int l,r;
}t[505];
char x[505];
char z[505];
int len,k;
int find(int le,int ri)
{
int u=k;
if(le>ri)
{
return 0;
}
for(int i=le;i<=ri;i++)
{
if(z[i]==x[u])
{
k++;
int q=find(le,i-1),h=find(i+1,ri);
t[u].l=q;
t[u].r=h;
t[q].f=u;
t[h].f=u;
}
}
return u;
}
void back(int y)
{
if(t[y].l)
{
back(t[y].l);
}
if(t[y].r)
{
back(t[y].r);
}
printf("%c",x[y]);
}
int main()
{
//freopen("build-tree.in","r",stdin);
//freopen("build-tree.out","w",stdout);
scanf("%s %s",x,z);
len=strlen(x);
find(0,len-1);
back(0);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二叉树 递归