zoukankan      html  css  js  c++  java
  • 剑指 Offer 33. 二叉搜索树的后序遍历序列

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

    参考以下这颗二叉搜索树:

        5
        / 
       2   6
      / 
     1   3
    

      

    示例 1:

    输入: [1,6,3,2,5]
    输出: false

    示例 2:

    输入: [1,3,2,6,5]
    输出: true  
    

    代码和思路:

    class Solution {
        public boolean verifyPostorder(int[] postorder) {
            //首先明确一点,二叉搜索树是有序树
            if (postorder.length < 2){
                return true;
            }
            return verify(postorder, 0, postorder.length - 1);
        }
        // 递归实现
        private boolean verify(int[] postorder, int left, int right)
        {
            if (left >= right) 
            {
                return true; //当前区域不合法的时候直接返回true就好
            }
            int rootValue = postorder[right]; // 当前树的根节点的值
            int k = left;
            while (k < right && postorder[k] < rootValue)
            {
                // 从当前区域找到第一个大于跟节点的,说明后续区域树值都在右子树中
                k++;
            }
            for (int i = k; i < right; i++)
            {
                // 进行判断后续的区域是否所有的值都是大于当前的根节点,如果出现小于的值直接返回false
                if(postorder[i] < rootValue)
                {
                    return false;
                }
            }
            // 当前树没问题就检查左右子树
            if (!verify(postorder, left, k-1))
            {
                return false; // 检查左子树
            }
            if (!verify(postorder, k, right - 1))
            {
                return false;  //检查右子树
            }
            return true; //最终都没问题就返回 true
        }
    }
    

      

  • 相关阅读:
    PHP 页面编码声明方法详解(header或meta)
    淘客部分功能实现源码
    CSS3动画效果应用
    JavaScript之Tab标签(原始版)
    JavaScript之淡入淡出
    关于响应式布局
    深入理解 SVG 系列(一) —— SVG 基础
    面试题
    随记
    一道经典面试题-----setTimeout(function(){},0)
  • 原文地址:https://www.cnblogs.com/ziytong/p/14922874.html
Copyright © 2011-2022 走看看