zoukankan      html  css  js  c++  java
  • 二叉搜索树的后序遍历序列(剑指offer-23)

    题目描述

    输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

    题目解析

    采用分治法的思想,找到根结点、左子树的序列、右子树的序列,分别判断左右子序列是否为二叉树的后序序列。

    1. 后序遍历序列的最后一个元素为二叉树的根节点;
    2. 二叉搜索树左子树上所有的结点均小于根结点、右子树所有的结点均大于根结点。

    算法步骤如下:
    1. 找到根结点;
    2. 遍历序列,找到第一个大于等于根结点的元素i,则i左侧为左子树、i右侧为右子树;
    3. 我们已经知道i左侧所有元素均小于根结点,那么再依次遍历右侧,看是否所有元素均大于根结点;若出现小于根结点的元素,则直接返回false;若右侧全都大于根结点,则:
    4. 分别递归判断左/右子序列是否为后序序列;

    算法解答

    public class Solution {
        public boolean VerifySquenceOfBST(int[] sequence) {
            if (sequence.length <= 0 || sequence == null) {
                return false;
            }
            return VerifySequenceOfBST1(sequence, 0, sequence.length - 1);
        }
    
        private boolean VerifySequenceOfBST1(int[] sequence, int start, int end) {
            //若遍历完了还没报错就证明是该二叉搜索树的后序遍历,则返回false
            if (start >= end) {
                return true;
            }
            //根节点
            int root = sequence[end];
            //找到第一个大于根节点的位置,左边则为左子树,右边则为右子树
            int i = start;
            while (sequence[i] <=root && i<end) {
                i++;
            }
            int j = i;
            //查看右子树有没有小于根节点的数,有就直接返回错误
            while (j < end) {
                if (sequence[j] < root)
                    return false;
                j++;
            }
            //若检验完右子树没有大于根节点的则下面用同样的方式递归左右子树
            boolean left = VerifySequenceOfBST1(sequence, start, i-1);
            boolean right = VerifySequenceOfBST1(sequence, i, end - 1);
            return left && right;
        }
    }
    
  • 相关阅读:
    【Python】python3.6中实现同一行动态输出
    【Python】将python3.6软件的py文件打包成exe程序
    【Java】分布式RPC通信框架Apache Thrift 使用总结
    【Java】加载驱动方法
    【Java】Comparable和Comparator接口的区别
    【Java】接口(interface)VS抽象类
    【Ubuntu】PHP环境安装-phpstudy for linux版
    【Ubuntu】xrdp完美实现Windows远程访问Ubuntu 16.04
    【系统设计】会议室预定系统房间预定系统设计
    jmeter场景设计:业务占比
  • 原文地址:https://www.cnblogs.com/yzhengy/p/13229530.html
Copyright © 2011-2022 走看看