剑指offer(java实现)第23题“二叉搜索树的后序遍历序列”-牛客网

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zm13007310400/article/details/81320626

题目描述

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

时间限制:1秒 空间限制:32768K 热度指数:240354

解答:

public class Solution {//按照二叉搜索树和后序遍历的特性可得:如:按层遍历的二叉搜索树为:5 3 7 2 4 6 8 1,则它的后续遍历为:1 2 4 3 6 8 7 5,且有如下规律:
    //根节点是最后一个元素5,从序列的开头开始遍历,一直到第一个比它大的数6截止,1 2 4 3是该根节点5的左子树,6 8 7是该根节点5的右子树;然后以3为根节点。。。以7为根节点。。。递归
    public boolean VerifySquenceOfBST(int [] sequence) {
        if (null == sequence || sequence.length == 0) {
            System.out.println("数组为null");
            return false;
        }
        int n = sequence.length;
        return verify(sequence, 0, n-1);
    }
    
    private boolean verify(int [] sequence, int start, int stop) {//最开始的start表示索引0,stop表示索引为n-1
        if (start >= stop) {
            return true;
        }
        int root = sequence[stop];//拿到根节点
        int i = start;
        for (;i<stop;i++) {//一直到当前的根节点
            if (root < sequence[i]) {//当找到大于root节点的元素时跳出来
                break;
            }
        }
        int j = i;//之所以换一个变量,是为了保存 i此时所在的位置,方便之后针对左右子树分别处理
        for (;j<stop;j++) {
            if (root > sequence[j]) {//如果二叉搜索树的右子树中有比root节点小的节点,则证明不对
                return false;
            }
        }
        return verify(sequence, start, i-1) && verify(sequence, i, stop-1);
    }
}

猜你喜欢

转载自blog.csdn.net/zm13007310400/article/details/81320626