您的位置:首页 > 其它

二叉树遍历

2015-07-22 11:39 323 查看
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=83498#problem/D

题意:

利用二叉树的先序遍历和中序遍历序列,求出后序遍历序列,输出后序遍历序列。(可输入多组案例,每个字符串是不超过26个不同字母组成的)

案例:

input

DBACEGF ABCDEFG

BCAD CBAD

output

ACBFGED

CDAB

思路分析:

先序=根节点+左子树+右子树

中序=左子树+根节点+右子树

后序=左子树+右子树+根节点

由上述可知,根节点在先序序列中都处于最前面的位置,而在中序中是处于中间的位置,则可以先找到根节点在把左右分成两个不同的序列,通过相关计算找出两个序列在先序的位 置,而树的每一层都有节点,可通过递归找出每一层的节点。建立树。

因为在后序中节点处于最后的位置,则可进行倒叙储存。

后序是先左子树再右子树,而节点是进行倒序储存,所以要先进行右子树的寻找,再进行左子树节点的寻找。

递归需要结束条件,如果节点等于中序遍历序列的最前位,则左子树为空,结束左子树节点的寻找。如果节点等于中序遍历序列的最后位,则右子树为空,结束右子树节点的寻找。

源代码如下:

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
char a[30],b[30],c[30];
int n,m;
void build(int x1,int y1,int x2,int y2)
{
m--;
c[m]=a[x1];               //倒叙储存节点
int i=x2;
while(b[i]!=c[m])i++;     //找到中序遍历序列中节点的位置
int s=i-x2;
if(i!=y2)build(x1+s+1,y1,i+1,y2);     //寻找右子树节点
if(i!=x2)build(x1+1,x1+s,x2,i-1);     //寻找左子树节点
}
int main()
{
while(scanf("%s%s",a,b)!=EOF)
{
n=strlen(a);               //求出序列长和节点个数
m=n;
build(0,n-1,0,n-1);       //建立树
for(int i=0;i<n;i++)
cout<<c[i];
cout<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: