验证二叉搜索树中的前序序列
题目:验证二叉搜索树中的前序序列
给定一组数字,验证它是否是二叉搜索树的正确的前序遍历序列。
示例1:
输入: preorder = [1,3,2]
输出: true
示例2:
输入:preorder=[4,2,1,3,6,5,7]
输出:true
题解
方法1:分治法
public class Solution {
private int[] order;
public boolean dfs(int left, int right, int min, int max)
{
if(left>right) return true;
for(int i=left;i<=right;i++)
{
if(order[i]>max || order[i]<min) return false;
}
int i;
for(i=left+1;i<=right;i++)
{
if(order[i]>order[left]){
break;
}
}
return dfs(left+1, i-1, min, order[left])&&dfs(i, right, order[left], max);
}
public boolean verifyPreorder(int[] preorder) {
order=preorder;
int i;
for(i=1;i<order.length;i++)
{
if(order[i]>order[0]){
break;
}
}
return dfs(1, i-1, Integer.MIN_VALUE, order[0])&& dfs(i, order.length-1, order[0], Integer.MAX_VALUE);
}
}
方法2:
左子树:小于根节点
右子树:大于根节点
利用栈,寻找当前节点的根节点
public class Solution1 {
public boolean verifyPreorder(int[] preorder) {
int min=Integer.MIN_VALUE;
Stack<Integer> stack=new Stack<>();
for (int p : preorder) {
if(p< min) return false;
while (!stack.empty() && p>stack.peek())
{
min=stack.pop();
}
stack.push(p);
}
return true;
}
}