数据结构中的数也是一个重难点. 本题考察二叉搜索树, 首先看二叉搜索树的定义 : 二叉搜索树(Binary Search Tree), 指的是一颗空树或者具有下列性质的二叉树 :
- 若任意节点的左子树不为空, 则左子树上所有的节点的值均小于它的根节点的值;
- 若任意节点的右子树不为空, 则右子树上所有的节点的值均大于它的根节点的值;
- 任意节点的左、右子树也分别为二叉查找树;
- 没有键值相等的节点
从上面的定义可以看到, 二叉搜索树的定义也是递归的, 那么就可以考虑从递归的方式解决这个问题.
递归思路
后序遍历序列的最后一个节点一定是根节点, 那么就可以通过根节点和左右子树节点的大小关系来将整个序列分为左子树的序列和右子树的序列, 然后再用递归的方法分别进行判断 :
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 []se, int start, int root){
if(start >= root)
return true;
int i = root;
while(i > start && se[i - 1] > se[root])
i--;
for(int j = start; j < i; j++){
if(se[j] > se[root])
return false;
}
return judge(se, start, i-1)&&judge(se, i,root-1);
}
}
非递归思路
对一个二叉搜索树来说, 根节点的左子树每个节点的值肯定小于右子树每个节点的值, 所以可以不断地去掉序列的最后一个值, 并且把剩下的部分分为小于最后一个值和大于最后一个值的部分, 只要能分出来就符合二叉树的定义.
每次最后一个值都是右子树的根比左子树的所有值要大, 这样将右子树判断完了, 到了左子树也是将左子树看成一颗具有左右子树的二叉搜索树.
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence.length == 0)
return false;
if(sequence.length == 1)
return true;
int start = 0;
int end = sequence.length - 1;
while(end > 0) {
while(sequence[start] < sequence[end]){
start ++;
}
while(sequence[start] > sequence[end]){
start ++;
}
if( start < end)
return false;
end--;
start = 0;
}
return true;
}
}