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));
        }
    }
  • 相关阅读:
    Linux日志文件/var/log详解
    QT 的信号与槽机制介绍
    利用线程通信,写2个线程,一个线程打印1~52,另一个线程打印A~Z,打印顺序应该使12A34B56C···5152Z
    mysql快速安装
    zabbix安装源
    mysql手动安装
    没有可用软件包 zabbixservermysql
    【转载】web 部署专题(一):Gunicorn运行与配置方法
    supervisor快速配置
    linux监控脚本状态失败后拉起
  • 原文地址:https://www.cnblogs.com/alias-blog/p/5462389.html
Copyright © 2011-2022 走看看