题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes
,否则输出No
。假设输入的数组的任意两个数字都互不相同。
样例:
8 / 6 10 / / 5 7 9 11 输入:5,7,6,9,11,10,8 输出:true
解法
序列的最后一个元素是二叉搜索树的根节点。
在序列中从左到右找到根节点的左子树(比根节点小)、右子树(比根节点大)。
- 如果右子树中出现比根节点小的元素,那么为 false。
- 否则递归左右子树。
例:5,7,6,9,11,10,8 1. 后序遍历结果的最后一个数字8是根结点的值 2. 前3个数5、7、6都比8小,是8结点的左子树;后3个数9、11、10都比8大,是8结点的右子树。 3. 同理,用同样的方法确定与数组每一部分对应的子树结构。
代码实现:
public class Solution { public static boolean verifySquenceOfBST(int[] sequence){ if(sequence == null || sequence.length < 1){ return false; } return verify(sequence, 0, sequence.length-1); } private static boolean verify(int[] sequence, int start, int end) { if(start>=end){ return true; } int val = sequence[end]; int i=start; while(i<=end){ if(sequence[i]>=val){ //左子树应小于根结点, =不能少,否则容易出现死循环 break; } i++; } for(int j=i; j<end; j++){ if(sequence[j]<val){ //右子树应大于根结点 return false; } } return verify(sequence, start, i-1) && verify(sequence, i, end-1); } public static void main(String[] args) { int[] List = {5,7,6,9,11,10,8}; // int[] List = {7,4,6,5}; boolean t = verifySquenceOfBST(List); System.out.println(t); } }