255. 验证前序遍历序列二叉搜索树
问题
给定一个整数数组,你需要验证它是否是一个二叉搜索树正确的先序遍历序列。
你可以假定该序列中的数都是不相同的。
例子
思路
二叉树搜索树:左<根<右
前序遍历特点:根-左-右
-
方法1
$$$$
分治法,第一个是根,往后找到第一个比根大的是右子树的开始,如果右子树都>根,则此根是合格的,然后再检查左子树和右子树
-
方法2
$$$$
先序遍历的特点:根->左->右,如果出现递减序列,则是左子树,否则是右子树,因为右子树一定是递增的。
所以:二叉树的先序遍历满足:局部递减,总体递增,为了达到总体递增,保证递减序列的第一个元素<结束递减后的第一个元素【递减序列的第一个元素:即每个子树的根,从下往上依次用min记录,子树的右子树肯定都>根的值】
遍历数组的时候,用栈保存(栈中都是递减的),如果<min,则没保持递增,返回false,否则,如果<栈顶元素,即该结点是栈顶元素的左结点,放入栈,否则,是栈顶结点的同辈右结点,将栈里元素依次弹出,(同辈左结点,父节点),直到栈顶结点>该结点或者为空,【如:父节点的父节点】【此时栈顶元素>该结点,保持递减栈】期间保存该结点的父节点到min,则后面新的结点【以该结点为父节点,或者该结点父节点的同辈右结点】一定会>min
代码
//方法1
class Solution {
public boolean verifyPreorder(int[] arr) {
return check(arr, 0, arr.length-1);
}
public boolean check(int[] arr, int i, int j){
if(i>=j) return true;
int root = arr[i];
// k为右子树的开始下标