码迷,mamicode.com
首页 > 其他好文 > 详细

[LeetCode] 255. Verify Preorder Sequence in Binary Search Tree

时间:2020-05-02 09:53:55      阅读:58      评论:0      收藏:0      [点我收藏+]

标签:col   etc   前序遍历   ret   tac   color   tput   ack   需要   

验证前序遍历序列二叉搜索树。题意是给一个二叉搜索树的前序遍历的结果,请你验证这个结果是否正确。例子,

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

因为是二叉搜索树,所以左孩子 < 根节点 < 右孩子,同时左子树是越来越小的,右子树是越来越大的(之于根节点)。总结下来就是局部递减,总体递增。这个题可以用单调栈的思路去做。为什么会有这个思路是因为原则上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] 255. Verify Preorder Sequence in Binary Search Tree

标签:col   etc   前序遍历   ret   tac   color   tput   ack   需要   

原文地址:https://www.cnblogs.com/aaronliu1991/p/12815693.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!