题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
public class Test { public static void main(String[] args) { int[] arr={5,7,6,9,11,10,8}; System.out.println(verifySquenceOfBST(arr,0, 4)); } /** * 在后序遍历得到的序列中, 最后一个数字是树的根结点的值。 * 数组中前面的数字可以分为两部分: 第一部分是左子树结点的值,它们都比根结点的值小 * 第二部分是右子树结点的值,它们都比根结点的值大。 * @param sequence * @param start 起始点 * @param length 序列长度 * @return */ public static boolean verifySquenceOfBST(int[] sequence, int start, int length) { // 序列为空,返回false if(sequence == null || length <= 0) return false; // 二叉树根节点,后序遍历序列的最后一个 int root = sequence[length - 1]; // 左子树结点的数都小于根节点 int i = 0; for(; i < length - 1; i++) { if(sequence[i] > root) // 大于根节点,跳出循环 break; } // 右子树结点的数都大于根节点 int j = i; for(; j < length - 1; j ++) { if(sequence[j] < root) return false; // 右子树中出现大于根节点的数,直接返回false } // 判断左子树是不是二叉搜索树 boolean left =true; if(i > 0) { // 左子树存在 left = verifySquenceOfBST(sequence, 0 ,i); } // 判断右子树是不是二叉搜索树 boolean right = true; if(i < length - 1) { // 右子树存在 right = verifySquenceOfBST(sequence, i, length - i - 1); } return left && right; } }