您的位置:首页 > 产品设计 > UI/UE

[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】,正确的二叉搜索树是:

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所有比当前数大得数。栈的增长方向也是从高向低了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: