剑指offer23题--经典递归

/**
 * 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。
 * 如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。
 * <p>
 * 思路
 * 二叉搜索树,满足根节点大于左子树所有节点,小于右子树左右节点
 * 将数组从后往前遍历,每个节点都是所在子树的根节点
 * 根节点,大于左子树所有节点,小于右子树左右节点,且子树仍然满足二叉搜索树
 * <p>
 * 把最后一个看作root,当前树怎么满足二叉搜索树的后序遍历。
 */
public class Solution23 {
    public boolean VerifySquenceOfBST(int[] sequence) {
        if (sequence == null || sequence.length == 0) {
            return false;
        }
        return verifySquenceOfBST(sequence, 0, sequence.length - 1);
    }

    private boolean verifySquenceOfBST(int[] sequence, int start, int root) {
        /**
         * 1、处理退出条件
         */
        if (start >= root) {
            return true;
        }
        int i = start;


        /**
         * 2、处理结果
         */
        //根节点,大于左子树所有节点
        for (; i < root; i++) {
            if (sequence[i] >= sequence[root]) {
                break;
            }
        }
        //根节点,小于右子树左右节点
        for (int right = i; right < root; right++) {
            if (sequence[right] < sequence[root]) {
                return false;
            }
        }
        /**
         * 3、缩小范围
         */
        //子树仍然满足二叉搜索树
        return verifySquenceOfBST(sequence, 0, i - 1) && verifySquenceOfBST(sequence, i, root - 1);
    }
}

小结:

1、处理退出条件

2、处理结果

3、缩小范围

posted @ 2020-08-21 17:25  Adom_ye  阅读(118)  评论(0编辑  收藏  举报