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

Posted aaronliu1991

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode] 255. Verify Preorder Sequence in Binary Search Tree相关的知识,希望对你有一定的参考价值。

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

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的主要内容,如果未能解决你的问题,请参考以下文章

[LeetCode] 255. Verify Preorder Sequence in Binary Search Tree 楠岃瘉浜屽弶鎼滅储鏍戠殑鍏堝簭搴忓垪

255. Verify Preorder Sequence in Binary Search Tree

255. Verify Preorder Sequence in Binary Search Tree

LeetCode Verify Preorder Sequence in Binary Search Tree

LeetCode Verify Preorder Serialization of a Binary Tree

Leetcode: Verify Preorder Serialization of a Binary Tree