二叉搜索树的后序遍历序列
原题:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。
如果是则返回true,否则返回false。
假设输入的数组的任意两个数字都互不相同。
样例
输入:[4, 8, 6, 12, 16, 14, 10]
输出:true
分析:
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
题目中给出的是二叉树的后序遍历序列,可知最后一个节点为根结点。在根据二叉搜索树的定义,从前往后遍历二叉树的后续遍历序列,第一个大于根结点的节点为分界线,后面的节点构成右子树,前面的结点构成左子树,若右子树中有结点小于根结点,则这不是一个二叉搜索树。
代码:
class Solution {
public:
//作用:把sequence提成全局变量,递归时少传一个参数
vector<int> seq;
bool verifySequenceOfBST(vector<int> sequence) {
//思路:二叉搜索树的特点每个结点的左子树都小于该结点,每个结点的右子树都大于该结点。
seq = sequence;
int root = sequence.size() - 1;
return dfs(0,root);
}
int dfs(int left,int root){
//递归出口,遍历完当前结点都符合二叉搜索树的性质
if(left >= root) return true;
int i=left;
int root_num = seq[root];
//找到以root为根的树的左子树
while(seq[i] < root_num && i < root) i++;
//判断以root为根的右子树是否都大于根结点,如果不大于则证明不是二叉搜索树
for(int k = i;k < root ;k++ ){
if(seq[k] < root_num) return false;
}
return dfs(left,i-1) && dfs(i,root-1);
}
};