对于一棵
二叉树T,我们可以递归定义它的先序遍历,中序遍历,后序遍历:
1、先序遍历 ( PreOrder(T) = T的根节点 + PreOrder(T的左子树) + PreOrder(T的右子树) )
2、中序遍历 ( InOrder(T) = InOrder(T的左子树) + T的根节点 + InOrder(T的右子树) )
3、后序遍历 ( PostOrder(T) = PostOrder(T的左子树) + PostOrder(T的右子树) + T的根节点 )
其中,加号表示字符串连接运算。例如,如图所示的二叉树,先序遍历为 DBACEGF ,中序遍历为 ABCDEFG
(画的略丑,请勿嫌弃)
要求:输入一棵树的先序遍历和中序遍历,输出他的后序遍历
样例输入:
DBACEGF ABCDEFG
BCAD CBAD
样例输出:
ACBFGED
CDAB
代码:
#include <stdio.h>
#include <string.h>
#define MAXN 1000 + 10
void build(int n, char *s1, char *s2, char *s){
if(n <= 0) return ;
int p = strchr(s2,s1[0]) - s2; //找到根节点在中序遍历中的位置
build(p,s1+1,s2,s); //递归构造左子树的后序遍历
build(n-p-1, s1+p+1,s2+p+1,s+p); //构造右子树的后序遍历
s[n-1] = s1[0];
}
int main(){
char s1[MAXN],s2[MAXN],ans[MAXN];
while(scanf("%s%s",s1,s2)==2){
int nLen = strlen(s1);
build(nLen,s1,s2,ans);
ans[nLen] = '\0';
puts(ans);
}
return 0;
}
通过这个示例,相信对与二叉树的遍历方式有了一定的了解吧,不知道你们有没有,反正我是有。
传送门:二叉树层次遍历