/** * 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。 * 如果是则返回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、缩小范围