输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是返回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)); }