题目描述:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。
如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。
(ps:我们约定空树不是二叉搜索树)
示例1
输入
[4,8,6,12,16,14,10]
返回值
true
思路分析:
二叉搜索树的特点是:如果当前节点有左子树,那么左子树的每一个节点的值都小于等于当前节点的值;如果当前节点有右子树,那么右子树的每一个点的值大于当前节点的值;
再来分析:树的后序遍历特点是什么,遍历顺序肯定是先左子树,后右子树,最后是根节点。
根据这两个特点我们可以知道,在传入的后续遍历序列里面,最后一个值是根节点,除了根节点,序列分为两部分:
以第一个大于根节点的值为分界线。第一个大于根节点的值之后的序列是根节点的右子树;
通过这些右子树的值来判断:
- 每一个都大于根节点,
如果大于表示当前节点满足平衡二叉树的特点。接下来我们分别对左子树和右子树做这样的处理。 - 有一个不满足
那就不是满足条件的后续遍历
重复两个操作,一直到没有节点可以被遍历。
代码展示:
/*
*输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。
* 如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。
* (ps:我们约定空树不是二叉搜素树)
* */
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
//二叉搜索树的特点,每个根节点都满足:节点的左子树都小于等于节点的值;节点的右子树都大于根节点的值
//int index=sequence.length-1;
if(sequence.length == 0){
return false;
}
return traverse(sequence,0,sequence.length-1);
}
public boolean traverse(int[] sequence,int start,int end){
if(start>=end){
return true;
}
int key=sequence[end];
int i=0;
for( i=start;i<end;i++){
if(sequence[i]>key)
break;
}
for(int j=i;j<end;j++){
if(sequence[j]<key){
return false;
}
}
return traverse(sequence,start,i-1)&&traverse(sequence,i,end-1);//在子树中遍历,除去根节点
}
}