Java 实现二叉搜索树的后序遍历序列

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

代码

    static boolean isLastOrder(int[] lastOrder, int start, int end) {
        if (lastOrder == null || start < 0 || end < 0 || start > end) {
            return false;
        }
        int length = lastOrder.length;
        if (start >= length || end >= length) {
            return false;
        }

        // 二叉树的后序遍历: 左->右->根,所以数组的最后一个元素是二叉树的根
        int root = lastOrder[end];

        // 搜索二叉树的特点是,左子树的任意节点均小于根节点,右子树任意节点均大于根节点
        // 结合后序遍历,找到大于数组最后一个元素的节点位置,则之前的元素都属于左子树
        int rightStart = start;
        while (rightStart < end) {
            // 找到左右子树分割点,从left开始之后都是右子树
            if (lastOrder[rightStart] > root){
                break;
            }
            rightStart++;
        }
        int rightEnd = rightStart;
        while (rightEnd < end) {
            // 如果右子树有小于root的元素,则说明不是后序遍历
            if (lastOrder[rightEnd] < root) {
                return false;
            }
            rightEnd++;
        }
        boolean leftIsLastOrder = true;
        // 如果右子树起始元素索引大于start, 说明当前根节点存在左子树
        if (rightStart > start) {
            leftIsLastOrder = isLastOrder(lastOrder, start, rightStart - 1);
        }
        boolean rightIsLastOrder = true;
        // 如果右子树起始元素索引小于end - 1, 说明当前根节点存在右子树
        if (rightStart < end - 1) {
            rightIsLastOrder = isLastOrder(lastOrder, rightStart, end - 1);
        }

        // 当前根节点的左子树和右子树都满足后序遍历
        return leftIsLastOrder && rightIsLastOrder;
    }

    public static void main(String[] args) {
        //           5
        //       3       18
        //   2       4
        // 后序遍历是2, 4, 3, 18, 5
        int[] order = {2, 4, 3, 18, 5};
        System.out.print(isLastOrder(order, 0, order.length - 1));
    }

猜你喜欢

转载自blog.csdn.net/zl18310999566/article/details/80164546