【LeetCode & 剑指offer 刷题笔记】目录(持续更新中...)
33 判断某序列是否为二叉搜索树的后序序列
题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
/*
后序遍历序列规律:最后一个元素为根结点,前面左半部分为左子树,右半部分为右子树
BST规律:对任意结点,左结点<根结点<右结点的
根据这两个规律进行判断
*/
class Solution
{
public:
bool VerifySquenceOfBST(vector<int>& sequence)
{
if(sequence.empty()) return false;
return verify(sequence, 0, sequence.size()-1);
}
private:
bool verify(vector<int>& a, int begin, int end)
{
if(begin >= end) return true; //只有一个元素了,其没有左右子树,没有判断的必要,故返回true
int root = a[end]; //根结点的值
//计算左子树序列的长度(左子树中结点值均小于根结点值)
int i = begin;
for(; i<end-1; i++) //注意这里最多扫描到倒数第二个元素(最后一个元素为根结点)
{
if(a[i] > root) break; //一旦大于根结点就退出
} //退出时,i即为左子树序列的长度
//判断右子树序列是否满足大于根结点的规律
for(int j = i; j<end-1; j++)
{
if(a[j] < root) return false; //若右子树不满足规律,则返回false
}
//判断左子树和右子树是否为二叉搜索树
return verify(a, begin, i-1) && verify(a, i, end-1);
}
};
相关题目:判断某序列是否为二叉搜索树的前序遍历结果