二叉树的后序遍历
题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
题目解析
后序遍历的数组有这样一个特征:最后一个为根节点,前一段为左子树,都比根节点小,后一段都为右子树,都比根节点大。然后我们再将前一段,后一段再进行递归判断是否符合要求。
代码解析
public static boolean VerifySquenceOfBST(int [] sequence) {
if(sequence.length==0) {
return false;
}
//最后一位肯定为根节点,将根节点赋值给root
int root=sequence[sequence.length-1];
int i=0;
//从第一个数字开始判断是否小于root,小于root的就是左子树,如果大于的话则退出
for(;i<sequence.length-1;i++) {
if(sequence[i]>root) {
break;
}
}
//继续刚才的下标,现在是右子树,因为右子树都大于根节点,如果有小于根节点的则退出
int j=i;
for(;j<sequence.length-1;j++) {
if(sequence[j]<root) {
return false;
}
}
//大的树完成验证,这时left,right为true,如果i大于0,则开始判断小子树,一直递归到最小
boolean left=true;
if(i>0){
left=VerifySquenceOfBST(Arrays.copyOfRange(sequence, 0, i));
}
boolean right=true;
if(i<sequence.length-1){
right=VerifySquenceOfBST(Arrays.copyOfRange(sequence, i, sequence.length-1));
}
//只有左右字数都满足,皆可以满足条件
return (left&&right);
}