例题-二叉搜索树的后序遍历序列

题目描述

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。(ps:我们约定空树不是二叉搜素树)

思路

由题是判断该序列是否为二叉搜索树的后序遍历,二叉搜索树为左节点<父节点<右节点的二叉树,而后序遍历的特点是根节点在最后;
由此可得在后序遍历序列中,小于根节点的值的结点位于左子树,大于根节点的值的结点位于右子树。

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
class Tree 
{
public:
bool VerifySquenceOfBST(vector<int> sequence) {
if(sequence.empty())//判断子树是否为空
return false;
else if(sequence.size()==1||sequence.size()==2)//当子树结点数为1或2时的情况
return true;
else
{
auto rootValue = sequence.back(); //当前子树根结点的值
int index = 0;
int lenth = sequence.size();
vector<int> left,right;
if(sequence[0] > rootValue)
{ //当最左边值大于根节点,即所有结点位于右子树
for(auto i = 0;i < lenth-1;++i)
{
right.push_back(sequence[i]);
if(sequence[i] < rootValue)
return false;
}
return VerifySquenceOfBST(right);
}else if(sequence[lenth-2] < rootValue)
{ //当最右边值小于根节点,即所有结点位于左子树
for(auto i = 0;i < lenth-1;++i){
left.push_back(sequence[i]);
if(sequence[i] > rootValue)
return false;
}
return VerifySquenceOfBST(left);
}else
{ //常规情况
for(auto i = 0;i < lenth;++i){
if(sequence[i] < rootValue && sequence[i+1] > rootValue){
index = i;
break;
}
}
for(auto i = 0;i <= index;++i)
{
left.push_back(sequence[i]);
if(sequence[i] > rootValue)
return false;
}
for(auto i = index + 1; i < lenth;++i)
{
right.push_back(sequence[i]);
if(sequence[i] < rootValue)
return false;
}
return VerifySquenceOfBST(left) && VerifySquenceOfBST(right);
}
}
}
};