二叉树重建

面试常考的一道题是二叉树的重建,比如给了先根遍历和中根遍历,让重构二叉树之类的,还有就是输出后根遍历。

例如:DBACEGF   ABCDEFG。输出 ACBFGED

思路:先根遍历第一个字符是根,需要在中根遍历中找到它,就知道左右子树的先根遍历和后根遍历了。(递归)

代码:

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];//把根结点添加到最后
}

主程序部分代码:

while(scanf("%s%s" , s1 , s2) == 2)
{
int n = strlen(s1);
build(n , s1 , s2 , ans);
ans[n] = '\0';
printf("%s\n",ans);
}

还有一种常见的方法:先构造出二叉树,然后后根遍历,方法参见 http://www.cnblogs.com/DiaoCow/archive/2010/04/17/1714273.html

你可能感兴趣的:(二叉树重建)