面试题33二叉搜索树的后序遍历序列

题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出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);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值