题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。
如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同
思路:根据平衡二叉树及后序遍历的性质,可以得出给定数组的最后一个数字是根节点,BST左子树的节点都小于根节点,右子树的节点都大于根节点,按照此规律可以找出序列里的左子树节点和右子树节点,接着判断,如果右子树节点里存在着小于根节点的数据,那么肯定不是后序序列。
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence.length == 0){
return false;
}
return isValidPostOrder(sequence, 0, sequence.length - 1);
}
public boolean isValidPostOrder(int[] sequence, int start, int end){
//访问到叶子节点
if(start >= end){
return true;
}
int root = sequence[end];
int k;
//找出左右子树的分界点
for(k = start; k < end; k++){
if(sequence[k] > root){
break;
}
}
int i = k;
//如果右子树中有小于根节点的节点,返回false
for(; i < end ;i++){
if(sequence[i] < root){
return false;
}
}
//递归判断左子树和右子树
return isValidPostOrder(sequence, start, k-1)
&& isValidPostOrder(sequence, k, end-1);
}