zoukankan      html  css  js  c++  java
  • [LeetCode] 255. Verify Preorder Sequence in Binary Search Tree

    Given an array of numbers, verify whether it is the correct preorder traversal sequence of a binary search tree.

    You may assume each number in the sequence is unique.

    Consider the following binary search tree: 

         5
        / 
       2   6
      / 
     1   3

    Example 1:

    Input: [5,2,6,1,3]
    Output: false

    Example 2:

    Input: [5,2,1,3,6]
    Output: true

    Follow up:
    Could you do it using only constant space complexity?

    验证前序遍历序列二叉搜索树。

    题意是给一个二叉搜索树的前序遍历的结果,请你验证这个结果是否正确。你可以假定该序列中的数都是不相同的。

    因为是二叉搜索树,所以左孩子 < 根节点 < 右孩子,同时左子树是越来越小的,右子树是越来越大的(之于根节点)。总结下来就是局部递减,总体递增。这个题可以用单调栈的思路去做。为什么会有这个思路是因为原则上BST的前序遍历,一开始只会是越来越小,所以无条件加入stack;当你突然遍历到一个比较大的元素X的时候,很有可能是左子树遍历完了要开始遍历右子树了,因为右子树的val一定大于其左子树的val和根节点的val,所以此时stack中所有小于X的元素都应该被pop出来,同时用一个变量max记录一下最后一个被pop出来的val,因为之后无论加入什么val,都一定要大于这个max,否则就不是BST了。

    具体实现方式是,首先设置一个变量max记录从stack中弹出的最大元素。将input里的元素按顺序加入stack,如果stack不为空且当前待加入的元素大于栈顶元素,那么需要开始pop出来所有比当前元素小的元素;在遍历过程中,如果发觉有任何一个元素小于max则返回false。

    跑一下第二个例子吧,一开始往stack中放入5,2,1都没问题,因为是递减的;再来碰到3的时候,因为比栈顶元素1大,所以要开始pop,按照逻辑,会pop出1和2,最后stack里面只剩下5,max = 2,此时加入3则没问题。遍历到6的时候,因为stack不为空且6比栈顶元素大,所以5也要被pop出来,然后放入6,遍历结束。

    但是第一个例子就会有问题,放入5,2没问题,但是遍历到6的时候,按照逻辑,stack会被清空并且max = 5,此时stack中放入6;但是再进行到下一步的时候就会有问题,此时cur = 1,他首先是小于栈顶元素(6)所以stack不会有东西弹出来,但是他小于max(5),所以return false。

    时间O(n)

    空间O(n)

    Java实现

     1 class Solution {
     2     public boolean verifyPreorder(int[] preorder) {
     3         Stack<Integer> stack = new Stack<>();
     4         int max = Integer.MIN_VALUE;
     5         for (int cur : preorder) {
     6             while (!stack.isEmpty() && cur > stack.peek()) {
     7                 max = stack.pop();
     8             }
     9             if (cur < max) {
    10                 return false;
    11             }
    12             stack.push(cur);
    13         }
    14         return true;
    15     }
    16 }

    LeetCode 题目总结

  • 相关阅读:
    base64 web前端js解码与转码
    react常见组件问题Can't perform a React state update on an unmounted component
    Git详细的多人开发心得
    数组中filter方法配合字符串方法trim使用
    Ant Design实现表格搜索、分页、多选处理
    Ant Design中日期选择器的disabledDate用法
    react学习资源汇总
    react开发项目到上线全过程详解
    MySQL-5.6.30-linux-glibc2.5-x86_64.tar.gz 安装教程
    linux下配置mysql主从复制配置
  • 原文地址:https://www.cnblogs.com/cnoodle/p/12815693.html
Copyright © 2011-2022 走看看