【题目】输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是,返回true,否则输出false。假设输入的数组的任意两个数字都互不相同。
【思路】首先我们得知道什么是二叉搜索树,二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。由这个性质我们可以知道,根节点左边的元素一定比根节点小,根节点右边的元素一直比根节点大,左右子树也符合这个规律,由于是后序遍历,所以整数数组的最后一个元素为根节点,它前面比它小都是左子树元素,比它大的都是右子树元素,而且左右子树都符合这个规律。所以我们获取整数数组的最后一个元素当做根节点,然后遍历它前面的所有元素,找到第一个比它大的,那么以这个元素为分界,前面的都是左子树元素,后面都是右子树元素,如果这个元素后面的所有元素都比根节点大,说明是正确的,反之则错误,正确我们继续分左右子树判断即可
public class Solution { public boolean VerifySquenceOfBST(int [] sequence) { return check(sequence,0,sequence.length-1); } public boolean check(int []array,int begin,int end){ //如果只有一个元素了,递归最深处,返回true if(begin >= end) return true; int root = array[end]; int firstMax = -1; for(int index = begin;index < end;index ++){ if(array[index] > root){ firstMax = index; break; } } //如果没有找到比根节点大的,说明没有右子树,那么直接判断左子树 if(firstMax == -1) return check(array,begin,end-1); //如果有右子树,那么检查右子树是否全部大于根节点 for(int i = firstMax+1;i < end;i++){ //如果右子树存在比根节点小的,返回false if(array[i] < root) return false; } //递归检查左右子树 return (check(array,begin,firstMax-1) && check(array,firstMax,end-1)); } }