zoukankan      html  css  js  c++  java
  • 二叉搜索树的后序遍历序列验证

    【题目】输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是,返回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));
        }
    }
  • 相关阅读:
    使用百度网盘配置私有Git服务
    Linked dylibs built for GC-only but object files built for retain/release for architecture x86_64
    我的博客搬家啦!!!
    今日头条核心业务(高级)开发工程师,直接推给部门经理,HC很多,感兴趣的可以一起聊聊。
    学习Python的三种境界
    拿到阿里,网易游戏,腾讯,smartx的offer的过程
    关于计算机网络一些问题的思考
    网易游戏面试经验(三)
    网易游戏面试经验(二)
    网易游戏面试经验(一)
  • 原文地址:https://www.cnblogs.com/alias-blog/p/5462389.html
Copyright © 2011-2022 走看看