Nowcoder java-二叉搜索树的后序遍历序列

Nowcoder java-二叉搜索树的后序遍历序列

(题目来自牛客网)
在这里插入图片描述

思路

    采用分治法的思想,找到根结点、左子树的序列、右子树的序列,分别判断左右子序列是否为二叉树的后序序列。
    
    由题意可得:
    1. 后序遍历序列的最后一个元素为二叉树的根节点;
    2. 二叉搜索树左子树上所有的结点均小于根结点、右子树所有的结点均大于根结点。
    
    算法步骤如下:
    1. 找到根结点;
    2. 遍历序列,找到第一个大于等于根结点的元素i,则i左侧为左子树、i右侧为右子树;
    3. 我们已经知道i左侧所有元素均小于根结点,那么再依次遍历右侧,看是否所有元素均大于根结点:
    a.若出现小于根结点的元素,则直接返回false;
    b.若右侧全都大于根结点,则分别递归判断左/右子序列是否为后序序列;

代码


public class VerifySquenceOfBST {
    public boolean verifySquenceOfBST(int[] sequence) {
        //采用分治法的思想,找到根结点、左子树的序列、右子树的序列,分别判断左右子序列是否为二叉树的后序序列。
        //
        //由题意可得:
        //1. 后序遍历序列的最后一个元素为二叉树的根节点;
        //2. 二叉搜索树左子树上所有的结点均小于根结点、右子树所有的结点均大于根结点。
        //
        //算法步骤如下:
        //1. 找到根结点;
        //2. 遍历序列,找到第一个大于等于根结点的元素i,则i左侧为左子树、i右侧为右子树;
        //3. 我们已经知道i左侧所有元素均小于根结点,那么再依次遍历右侧,看是否所有元素均大于根结点;若出现小于根结点的元素,则直接返回false;若右侧全都大于根结点,则:
        //4. 分别递归判断左/右子序列是否为后序序列;
        if (sequence.length <= 0 || sequence == null) {
            return false;
        }
        return verifySquenceOfBST1(sequence, 0, sequence.length - 1);
    }
    public boolean verifySquenceOfBST1(int[] sequence, int start, int end) {
        if (start >= end) {//若遍历完了还没报错就证明是该二叉搜索树的后序遍历,否则返回false
            return true;
        }
        int root = sequence[end];//找根节点
        int i = start;
        while (sequence[i] <= root && i < end) {//找根节点右子树的第一个节点,左侧为左子树,右侧为右子树
            i++;
        }
        int j = i;
        while (j < end) {//判断右子树中有没有比根节点小的值
            if (sequence[j] < root) {
                return false;
            }
            j++;
        }
        boolean left = verifySquenceOfBST1(sequence, start, i - 1);//递归左子树
        boolean right = verifySquenceOfBST1(sequence, i, end - 1);//递归右子树
        return left && right;
    }

    public static void main(String[] args) {
        int[] sequence = {7,4,6,5};
        System.out.println(new VerifySquenceOfBST().verifySquenceOfBST(sequence));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值