题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路
借助辅助函数:判断是不是BST,判断函数算法过程:
- 找到根结点;
- 遍历序列,找到第一个大于等于根结点的元素i,则i左侧为左子树、i右侧为右子树;
- 我们已经知道i左侧所有元素均小于根结点,那么再依次遍历右侧,看是否所有元素均大于根结点;若出现小于根结点的元素,则直接返回false;若右侧全都大于根结点,则:
- 分别递归判断左/右子序列是否为后序序列;
实现
//借助辅助函数:判断树是不是BST(左<根<=右)
public boolean VerifySquenceOfBST(int [] sequence) {
//特殊情况:后序序列为空或只有一个元素//
if(sequence.length==0) return false;
if(sequence.length==1) return true;
//调用判断函数
return judge(sequence,0,sequence.length-1);
}
//辅助函数:判断树是不是BST
public boolean judge(int[] seq,int start,int end){
//序列最后一个是根结点,第一个大于根结点的元素:即为右子树开始元素,其左边就是左子树
if(start>=end) return true; //递归出口
int root=seq[end]; //序列最后一个是根结点
//找左子树结点(都比根结点小)
int i=start;
while(seq[i]<root){ //最后一次循环i到达了右子树开头
i++;
}
//左子树结束,下一个就是右子树,若右子树中有比根小的,说明肯定不是后序序列
int j=i;
while(j<end){
if(seq[j]<root) return false;
j++;
}
//再通过递归判断左右子树是否是后序遍历,两棵子树都符合,最终才能返回真
boolean left=judge(seq,start,i-1);
boolean right=judge(seq,j,end-1);
return left && right;
}