验证二叉搜索树前后序_255. 验证前序遍历序列二叉搜索树_面试题33. 二叉搜索树的后序遍历序列

本文主要讨论如何验证一个给定的整数数组是否是二叉搜索树的前序或后序遍历序列。针对255题和面试题33,分别介绍了两种方法,利用分治法和单调栈来判断序列是否满足二叉搜索树的特性。在前序遍历中,通过保持局部递减和总体递增来验证;在后序遍历中,翻转序列后转化为先序遍历的问题,同样利用单调栈确保局部递增和总体递减。
摘要由CSDN通过智能技术生成

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为右子树的开始下标
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值