题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
样例:
5,7,6,9,11,10,8 true
7,4,6,5 false
思路:
二叉搜索树(二叉查找树),满足左节点比根节点小,右节点比根节点大,它的左右子树也是二叉查找树。
根据以上性质:从后往前遍历数组,找到比根节点小的节点,根节点就是数组的最后一个元素。找到这个节点后可以判断前面的元素是否都是小于根节点的,理论上应该是的,如果有比根节点大的则返回false。这里不用理会该节点后面的元素,因为我们是从后往前遍历,后面的元素都是比根节点大的。然后把该节点的下标,和数组的起始位置递归。
关键点是要判断前面的元素是否比根节点小,这是返回false的条件
返回true的条件是start大于等于end是就返回true,因为等于的话只能判断左子树,加上大于能把右子树也判断上。因为右子树如果只剩一个节点,lindex+1==end ,所以lindex+1和end-1会不相等
package 解决面试题的思路;
public class 面试题33二叉搜索树的后序遍历序列 {
public static class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence==null||sequence.length==0) return false;
int len=sequence.length;
boolean result = VerifySquenceOfBST(sequence,0,len-1);
return result;
}
public boolean VerifySquenceOfBST(int [] sequence,int start,int end ) {
if(start>=end) return true;
int root = sequence[end];
int lindex=end-1;
while(lindex>start&&sequence[lindex]>root){
lindex--;
}
for(int i=start;i<=lindex;i++){
if(sequence[i]>root) return false;
}
boolean left =VerifySquenceOfBST(sequence,start,lindex);
boolean right =VerifySquenceOfBST(sequence,lindex+1,end-1);
boolean result=left&&right;
return result;
}
}
public static void main(String[] args){
//int arrays[]=new int[]{5,7,6,9,11,10,8};
int arrays[]=new int[]{7,4,6,5};
Solution solution = new Solution();
boolean result = solution.VerifySquenceOfBST(arrays);
System.out.println(result);
}
}