NO-23 二叉搜索树的后续遍历
题目描述:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。(ps:我们约定空树不是二叉搜素树)
输入:
[4,8,6,12,16,14,10]
输出:
true
解法1:递归写法
class Solution {
public:
// 根据二叉搜索树的性质 左子树 小于根 小于右边 子树 根据后续遍历的性质 最后一个元素一定是根节点 sequence[high]表示根节点
bool VerifySquenceOfCore(vector<int> sequence,int low,int high) { //4 10
if(low>=high)return true;
int start=low;
while(start<high&&sequence[start]<sequence[high])++start;//满足二叉搜索树的条件 左<根<右
//找到第一个大于根的元素,在他之前都是左子树,之后都是右子树
for(int i=start;i<high;i++)
if(sequence[i]<=sequence[high])return false;//右子树必须全部大于根,否则为假
return VerifySquenceOfCore(sequence,low,start-1)//判断当前节点的左子树
&&VerifySquenceOfCore(sequence,start,high-1); //判断当前节点的右子树
}
bool VerifySquenceOfBST(vector<int>sequence){
if(sequence.empty())return false;//为空
if(sequence.size()==1)return true;//只有一个元素,为假
return VerifySquenceOfCore(sequence,0,sequence.size()-1);
}
};
二叉搜索树:
二叉搜索树是一种节点值之间具有一定数量级次序的二叉树,对于树中每个节点:
- 若其左子树存在,则其左子树中每个节点的值都不大于该节点值;
- 若其右子树存在,则其右子树中每个节点的值都不小于该节点值;