题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同
思路
-
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
-
利用二叉搜索树的特点,在后序序列中通过比较与根结点(也就是最后一个值)的关系,找到相应的左子树和右子树,如果左子树或者右子树不符合二叉搜索树的定义,就不是二叉搜索树了
AC代码
#include <iostream>
#include <vector>
using namespace std;
class Solution
{
public:
bool VerifySquenceOfBST(vector<int> sequence)
{
return so(sequence,0,sequence.size()-1);
}
bool so(vector<int> sequence, int begin, int end)
{
if (sequence.empty() || begin > end)
return false;
int root = sequence[end];
int i = begin;
for (; i < end; i++)//注意这里不包括end,因为只需要比较end前面的数字而已
{
if (sequence[i] > root)
break;
}
int j = i;
for (; j < end; j++) //从j开始就是判断右子树是否都大于根结点
{
if (sequence[j] < root)
return false;
}
bool left = true;
if (i > begin) //判断是否有左子树
so(sequence, begin, i - 1);
bool right = true;
if (i < end - 1) //判断是否有右子树
so(sequence, i, end - 1);
return left && right;
}
};
int main()
{
Solution s;
vector<int>v = {4,5,2,6,7,3,1};
if (s.VerifySquenceOfBST(v) == true)
cout <<"yes" <<endl;
else
{
cout <<"no" << endl;
}
return 0;
}
/*
测试样例:功能测试
- 只有右子树的bst {8,7,6,5}
- 只有左子树的bst {1,2,3,4}
- 不是搜索树 {7,4,6,5}
- 是搜索二叉树{4,5,2,6,7,3,1}==》 1,2,3,4,5,6,7广度遍历的完全二叉树
特殊测试:空序列
*/