二叉搜索树的定义是左孩子节点永远比根节点小,右孩子节点永远比根节点大。
比如这个二叉树就是一个二叉搜索树,它的后序遍历为 15 30 20 70 60 50。
后序遍历的原则是从左孩子节点到右孩子节点最后到根节点,因此最后一个节点便是根节点50。
那么我们怎么判断呢,我们可以看到 15 30 20 都比 50 小,70 60 都比 50 大,对于一个正常的序列他们的个数和等于总序列的长度减去1。再看下一个:15 30 20 都比 60 小,70 比 60 大,4等于5-1。
那么我们可以模拟一下编程思路:
length=6;count=0;
15<50 满足条件 i=1 30<50 满足条件 i=2 20<50 满足条件 i=3 70<50 不满足
70>50 满足条件 i=4 60>50 满足条件 i=5 最后 50==50 结束
很容易发现 i 的值和length-1的值如果相同,说明对于这个根节点,它的所有孩子节点都是对的。
根据这个思想,我们完善代码:
class Solution
{
public:
bool VerifySquenceOfBST( vector<int> sequence)
{
int count = 0;
int length = sequence.size();
if (length <= 0)
return false;
while (length)
{
while (sequence[count]<sequence[length - 1])
count++;
while (sequence[count]>sequence[length-1])
{
if (sequence[count] == sequence[length - 1])
break;
count++;
}
if (count != (length-1))
return false;
count = 0;
length--;
}
return true;
}
};
最后我们做一个测试:
int main()
{
Solution T;
vector<int>tmp = { 15,30,20,70,60,50};
bool R;
R = T.VerifySquenceOfBST(tmp);
cout << R << endl;
return 0;
}
运行结果: