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));
        }
    }
  • 相关阅读:
    select函数
    ascy_finder|base|cookie 代码测试
    正则表达式之道
    教务系统破解
    jquery API
    test
    如何获取和发送Http请求和相应
    header中ContentDisposition的作用
    Performance Testing 系列
    LINQ
  • 原文地址:https://www.cnblogs.com/alias-blog/p/5462389.html
Copyright © 2011-2022 走看看