美文网首页
23. 二叉搜索树的后序遍历

23. 二叉搜索树的后序遍历

作者: 丶沧月 | 来源:发表于2019-03-14 12:41 被阅读0次

题目描述

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

image.png

解题思路

性质:

  • 二叉排序树的性质:左子树上所有节点的值均小于它的根节点;右子树上所有节点的值均大于它的根节点。
  • 二叉排序树后序遍历的性质:序列最后一个数字是根节点,序列剩余部分分成两部分,前一部分是左子树,后一部分是右子树。

举例:

  • 判断序列{5,7,6,9,11,10,8}是否是二叉排序树的后序遍历。其中,8是根节点,{5,7,6}比8小是左子树,{9,11,10}比8大是右子树。
  • 判断{5,7,6}是否是二叉排序树,其中6是根节点,5比6小是左子树,7比6大是右子树。
  • 判断{9,11,10}是否是二叉排序树,其中10是根节点,9比10小是左子树,11比10大是右子树。

代码实现

    public boolean VerifySquenceOfBST(int[] sequence) {
        /*
         * 判空条件必须是两个:
         *      |--sequence == null为true,不会执行sequence.length == 0
         *      |--sequence == null为false,执行sequence.length == 0不会报空指针异常
         */
        
        if (sequence == null || sequence.length == 0)
            return false;
        int N = sequence.length;
        return VerifySquenceOfBST(sequence, 0, N - 1);
    }
 
    private boolean VerifySquenceOfBST(int[] sequence, int left, int right) {
        if (left >= right)
            return true;
        int root = sequence[right];
        //i记录比root(根节点)大的第一个元素的索引
        int i = left;
        for (; i < right - 1; i++) {
            if (sequence[i] > root)
                break;
        }
        //如果右子树有元素小于root,返回false;
        for (int j = i; j < right - 1; j++) {
            if (sequence[j] < root)
                return false;
        }
        //否则递归求解左子树和右子树
        return VerifySquenceOfBST(sequence, left, i - 1) && VerifySquenceOfBST(sequence, i, right - 1);
    }

相关文章

网友评论

      本文标题:23. 二叉搜索树的后序遍历

      本文链接:https://www.haomeiwen.com/subject/enwxmqtx.html