这个题目刚开始不太会,虽然知道后序遍历的特点,也知道左子树都小于根节点、右子树都大于根节点,且根节点总是一个子树的最后一个节点,但还是无法下手的感觉。最后知道了怎么做,其实就是对于一个树,找到左右子树的分界点,然后分界点左边肯定是都比根节点小,因为我们就是利用左子树的特点去找分界点,那么真正要判断是否符合的就是右子树中的所有元素是不是都大于根节点即可。如果满足则递归判断左右子树,否则返回false。
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence == null || sequence.length == 0)
return false;
return helper(sequence, 0, sequence.length-1);
}
//一个树的开始和结束(根节点)
private boolean helper(int[] sequence, int start, int root) {
//只剩下一个节点了,肯定满足,返回true
if(start >= root)
return true;
int boundary = start; //找到左子树的边界
for(; start < root && sequence[boundary] < sequence[root];boundary++);
for(int j = boundary; j < root; ++j) { //判断右子树是否全都满足大于根节点的值
if(sequence[j] < sequence[root])
return false;
}
//都满足则递归哦按段左右子树
return helper(sequence, start, boundary-1)
&& helper(sequence, boundary, root-1);
}
}