二叉搜索树后序遍历序列判定

二叉搜索树想必大家都非常熟悉。它是一颗二叉树,对于任意一个节点n均满足:n的左儿子值比右儿子小,n的右儿子值比左儿子大。

对于二叉搜索树的后序遍历是先访问子树根节点的左子树、右子树,最后在访问子树根节点。

上述二叉搜索树的后序遍历序列:1,7,9,8,5,17,15,20,10.

这里主要是解决二叉搜索树后序遍历序列判定问题,具体描述如下:

判断该数组是不是某二叉搜索树的后序遍历的结果。
输入:一个整数数组,假设输入的数组的任意两个数字都互不相同。
输出:如果是则输出Yes,否则输出No。

解决方案:考虑后序遍历最后输出的节点是根节点,则可以根据大小关系,将序列分成三部分:左子树序列,右子树序列,根节点。故而可以判断该序列是否为二叉搜索树后序遍历的结果。

 1 #include <iostream>
 2 #include <vector>
 3 
 4 using namespace std;
 5 
 6 /**
 7  * 递归分解该序列,判断其是否为后序遍历结果
 8  */
 9 bool fun(vector<int> sequence)
10 {
11     int length = sequence.size();
12     //length=0: 某子树只含左或右子树时,另一子数为空
13     //length=1: 某子树不含左右子树
14     if (length <= 1)
15         return true;
16     int root = sequence[length-1];
17     int i = 0, j = length - 2;
18     //得到左子树序列位置
19     while (i < length - 1 && sequence[i] < root)i++;
20     //得到右子树序列位置
21     while (j >= 0 && sequence[j] > root)j--;
22     //若为后序遍历结果,则i,j关系为i=j+1
23     if (i != j + 1)
24         return false;
25     else
26     {
27         vector<int> ltemp;
28         vector<int> rtemp;
29         //得到左子树序列
30         ltemp.insert(ltemp.begin(), sequence.begin(), sequence.begin()+i);
31         //得到右子树序列
32         rtemp.insert(rtemp.begin(), sequence.begin() + j + 1, sequence.end()-1);
33         int ll = ltemp.size();
34         int lr = rtemp.size();
35         //递归判断左子树和右子树
36         return fun(ltemp) & fun(rtemp);
37     }
38 }
39 
40 /**
41  * 判断sequence是否为二叉搜索树后序遍历的结果
42  */
43 bool VerifySquenceOfBST(vector<int> sequence)
44 {
45     //判断序列是否为空
46     if(sequence.size() <= 0)
47         return false;
48     return fun(sequence);
49 }
50 
51 int main()
52 {
53     //测试数据
54     int a[7] = {4,8,6,12,16,14,10};
55     //int a[5] = {5,4,3,2,1};
56     vector<int> sq(a,a+7);
57     int length = sq.size();
58     cout << VerifySquenceOfBST(sq) << endl;
59     return 0;
60 }

猜你喜欢

转载自www.cnblogs.com/Flian/p/9657691.html