首页 > 代码库 > UVa 二叉树重建(先序+中序求后序)

UVa 二叉树重建(先序+中序求后序)

题意是给出先序和中序,求出后序。

先序遍历先访问根结点,通过根结点可以在中序中把序列分为左子树部分和右子树部分,我建了一个栈,因为后序遍历最后访问根结点,所以把每次访问的根结点放入栈中。因为后序遍历先是左子树然后是右子树,所以在递归的时候就先递归右子树,然后继续递归左子树。

写完程序后有个错误,找了很久才发现,就是我原本在计算左子树个数的时候,是这样计算的,pre2=mid-pre,但是当pre>mid时,就不对了。而正确计算左子树的方法应该是下面这样的。

 1 #include<iostream>
 2 #include<cstring>
 3 #include<stack>
 4 using namespace std;
 5 
 6 char t1[30], t2[30];
 7 stack<char>map;
 8 int length;
 9 
10 void solve(int pre, int mid, int len)
11 {
12     map.push(t1[pre]);
13     int i = mid;
14     while (t2[mid] != t1[pre]) mid++;             //在中序序列中找到与前序序列相同的结点
15     int pre2 = mid - i;                            //左子树的数量
16     int mid2 = len - 1 - pre2;                     //右子树的数量
17     if (mid2 >= 1)                                 
18         solve(pre + pre2 + 1, mid + 1, mid2);
19     if (pre2 >= 1)
20         solve(pre + 1, mid - pre2, pre2);
21 }
22 
23 
24 int main()
25 {
26     while (cin >> t1 >> t2)
27     {
28         length = strlen(t1);
29         solve(0, 0, length);
30         while (!map.empty())
31         {
32             char s = map.top();
33             cout << s;
34             map.pop();
35         }
36         cout << endl;
37     }
38     return 0;
39 }

 

UVa 二叉树重建(先序+中序求后序)