[leetcode 255] Verify Preorder Sequence in Binary Search Tree ---先序遍历验证二叉搜索树
2016-03-08 23:07
573 查看
Question:
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.
Follow up: Could you do it using only constant space complexity?
分析:
题目意思是给定一个数组,检查这个数组是否是一个二叉搜索树的先序遍历。
可以知道,数组的第一个值为跟几点,往后如果是降序,这说明在向左遍历,如果开始升序,则说明在向右遍历。(升序与降序相对于根节点)。
举一个例子分析编程思路:
给定数组是【10,5,2,6,12】和【10,5,2,6,12,9】,正确的二叉搜索树是:
用栈暂存降序路径,初始化最小值min为系统最小值,开始判断10,比最小值大,而且栈为空,所以将10入栈----》判断5,比最小值大,入栈--》判断2,比最小值小,入栈-----》判断6,6比当前最小值min大,但是比栈顶元素大,说明开始升序向右走了,所以将2出栈,并且min设置为2;此时栈顶元素为5,仍旧比6小,所以将5出栈,min设置为5;栈顶变为10,比6大,则将6入栈-------》判断12,同上,比栈顶6大,10大,升序部分,出栈,最终min设置为10,12入栈。如果此时出现9,因为升序部分说明12之前的最小值是10,那么12之后的数据应该都比10大,如果是9,不满足这种情况,说明此数组不是二叉搜索树的先序遍历。
可知,min记录的是开始上升阶段前的里升点最近的最小值。以此判断此后的值都比此最小值大。这是条件限制点。
代码如下:
验证中序遍历:
中序序列是有序的,验证给定数组是否是升序的即可;
验证后续遍历:
后序序列的顺序是left - right - root,而先序的顺序是root - left - right。
我们同样可以用本题的方法解,不过是从数组的后面向前面遍历,因为root在后面了。而且因为从后往前看是先遇到right再遇到left,所以我们要记录的是限定的最大值,而不再是最小值,栈pop的条件也变成pop所有比当前数大得数。栈的增长方向也是从高向低了。
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.
Follow up: Could you do it using only constant space complexity?
分析:
题目意思是给定一个数组,检查这个数组是否是一个二叉搜索树的先序遍历。
可以知道,数组的第一个值为跟几点,往后如果是降序,这说明在向左遍历,如果开始升序,则说明在向右遍历。(升序与降序相对于根节点)。
举一个例子分析编程思路:
给定数组是【10,5,2,6,12】和【10,5,2,6,12,9】,正确的二叉搜索树是:
10 / \ 5 12 / \ 2 6
用栈暂存降序路径,初始化最小值min为系统最小值,开始判断10,比最小值大,而且栈为空,所以将10入栈----》判断5,比最小值大,入栈--》判断2,比最小值小,入栈-----》判断6,6比当前最小值min大,但是比栈顶元素大,说明开始升序向右走了,所以将2出栈,并且min设置为2;此时栈顶元素为5,仍旧比6小,所以将5出栈,min设置为5;栈顶变为10,比6大,则将6入栈-------》判断12,同上,比栈顶6大,10大,升序部分,出栈,最终min设置为10,12入栈。如果此时出现9,因为升序部分说明12之前的最小值是10,那么12之后的数据应该都比10大,如果是9,不满足这种情况,说明此数组不是二叉搜索树的先序遍历。
可知,min记录的是开始上升阶段前的里升点最近的最小值。以此判断此后的值都比此最小值大。这是条件限制点。
代码如下:
<span style="font-size:14px;">class Solution { public : bool verifyPreorder(vector<int>& preorder) { stack stk; // 初始化最小值为最小整数 int min =INT_MIN; for(int num : preorder){ // 违反最小值限定则是无效的 if(num < min) return false; // 将路径中所有小于当前的数pop出来并更新最小值 while(!stk.isEmpty() && num > stk.peek()){ min = stk.pop(); } // 将当前值push进去 stk.push(num); } return true; } }</span>
验证中序遍历:
中序序列是有序的,验证给定数组是否是升序的即可;
验证后续遍历:
后序序列的顺序是left - right - root,而先序的顺序是root - left - right。
我们同样可以用本题的方法解,不过是从数组的后面向前面遍历,因为root在后面了。而且因为从后往前看是先遇到right再遇到left,所以我们要记录的是限定的最大值,而不再是最小值,栈pop的条件也变成pop所有比当前数大得数。栈的增长方向也是从高向低了。
相关文章推荐
- 运用Runtime全局修改UILabel的默认字体
- removing-guest-session-at-login-in-ubuntu-14-04
- 315.Count of Smaller Numbers After Self My Submissions Question
- 快速排序(Quick Sort)
- UIButton 的基本用法
- 21. 手势识别之UITapGestureRecognizer
- 去掉UItableview headerview黏性(sticky)
- ***LeetCode 95. Unique Binary Search Trees II
- IOS-UITableViewStyle设置Group、Plain问题
- UI笔记2
- UITextView实现图文混排效果
- 20. 手势识别之UISwipeGestureRecognizer
- UI控件
- ios8 UITableView设置 setSeparatorInset:UIEdgeInsetsZero不起作用的解决办法
- 动态规划 Common Subsequence
- UI控件闪灯
- HashMap HashTable ConcurrentHashMap key和value是否可以null的问题 源码分析
- ios UI数据库 sqlite小型数据库的增、删、改、查、排序
- UITextView 文本垂直居中
- 从NavigationController 下的UITableView中移除 header