验证给定序列是否是BST的preoder序列

本文介绍了一种验证给定序列是否为有效二叉搜索树(BST)前序遍历序列的方法。通过递归地查找根节点,并确定左子树和右子树的边界,确保所有左子树节点小于根节点且右子树节点大于根节点。

from leetcode https://leetcode.com/problems/verify-preorder-sequence-in-binary-search-tree/

比如序列 2, 1, 3 是如下图的BST的preorder 序列:

210423_uZrI_922297.jpg

但是2, 3, 1就不会是一个preorder序列;

先复习一下BST,给定一个节点,其左子树的所有节点都小于该节点,右子树的所有节点都大于该节点;preorder序列是指在遍历该BST的时候,先记录根节点,再遍历左子树,然后遍历右子树;所以一个preorder序列有这样一个特点,左子树的序列必定都在右子树的序列之前;并且左子树的序列必定都小于根节点,右子树的序列都大于根节点;

根据上面的特点很容易通过递归的方式完成:

  1. 如果序列只有一个元素,那么肯定是正确的,对应只有一个节点的树;

  2. 如果多于一个元素,以当前节点为根节点;并从当前节点向后遍历,直到大于根节点的节点出现(或者到尾巴),那么根节点之后,该大节点之前的,是左子树;该大节点及之后的组成右子树;递归判断左右子树即可;

  3. 那么什么时候一个序列肯定不是一个preorder序列呢?前面得到的右子树,如果在其中出现了比根节点还小的数,那么就可以直接返回false了;

代码如下:

public boolean verifyPreorder(int[] preorder) {
    return verifyPreorder(preorder, 0, preorder.length);
}

public boolean verifyPreorder(int[] seq, int start, int end) {
    if (start + 1 >= end) {
        return true;
    }

    int root = seq[start];

    int i = start + 1;
    while (i < end && seq[i] < root) {
        i++;
    }

    if (i < end) {
        int j = i;
        while (j < end && seq[j] > root) {
            j++;
        }
        if (j < end) {
            return false;
        }

        return verifyPreorder(seq, start + 1, i) && verifyPreorder(seq, i, end);
    } else {
        return verifyPreorder(seq, start + 1, end);
    }
}


转载于:https://my.oschina.net/u/922297/blog/498356

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值