标签:col etc 前序遍历 ret tac color tput ack 需要
验证前序遍历序列二叉搜索树。题意是给一个二叉搜索树的前序遍历的结果,请你验证这个结果是否正确。例子,
Consider the following binary search tree:
5 / 2 6 / 1 3Example 1:
Input: [5,2,6,1,3] Output: falseExample 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