剑指offer第二十三题。
题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
解题思路
首先要了解二叉搜索树的重要性质:根节点root的所有左子树的值都小于他,右子树的所有值都大于他。并且一个节点的值大于他的左孩子的值,小于右孩子的值。
比如这个树就满足二叉搜索树的性质:
1 2 3 4 5 6 7
| 二叉搜索树示例:
20 / \ 15 25 / \ 10 18
|
那么它的后续遍历是 10 18 15 25 20
显然,数组的最后一个值是树的root,25是其右子树,10-15都是其左子树,那么前三个数都要比20小,这样才能满足条件。然后再以15为root,递归判断。
我的答案
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| public class Solution { public boolean VerifySquenceOfBST(int [] sequence) { if(sequence.length == 0){ return false; } if(sequence.length == 1){ return true; } return judge(sequence,0,sequence.length-1); } private boolean judge(int[] sequence,int start,int end){ if(start >= end){ return true; } int i = end-1; while(i>start && sequence[i] > sequence[end]){ i--; } for(int j=0;j<i;j++){ if(sequence[j] > sequence[end]){ return false; } } return judge(sequence,0,i) && judge(sequence,i,end-1); } }
|