首先二叉搜索树满足的条件:rightchild.val>root.val>leftchild.val
后续遍历的顺序是:左右根,那么数组的最后一个位置就是root节点的值,比如[4,8,6,12,16,14,10] 根节点就是10;
- 定位到了根节点,开始定位root节点的左右child,左孩子是第一个小于root的节点,右孩子是第一个大于root的节点
leftchild的查找
int l=endNode-1;
for(;l>=startNode;l--){//从右往左查找,第一个比endNode小的就是左子树的根节点索引
if(sequence[endNode]>sequence[l]){
break;
}
}
rightchild的查找
int r=endNode-1; //第一个比root值大的节点
for (;r>=startNode;r--){
if(sequence[r]>sequence[endNode]) break;
}
判定数组是否符合二叉搜索树的后序遍历条件
for (int i=l;i>=startNode;i--){
if(sequence[endNode]<sequence[i]){
return false;
}
}
要求以leftchild为根的子树中,没有比root的值大的节点;
这里只需要这一个就可以了,不需要再判断rightchild中有没有比root节点小的值
因为我们在判定leftchild时就是第一个比root节点小的值,比如这样的数组[4,8,6,12,16,2,10] 直接判定2就是root->10的左子树的根节点
下面就是递归的判断各个左右子树是否符合二叉搜索树
boolean left=true;
if(l>0){
left= test(sequence,startNode,l);
}
boolean right=true;
if(r>startNode){
right= test(sequence,l+1,r);
}
return right&&left;
需要注意的边界条件和返回条件
//返回条件
if(startNode==endNode)//这种情况下就是单独一个节点,满足题目要求
return true;
if(l>0){//l>0要求左子树存在
left= test(sequence,startNode,l);
}
if(r>startNode){//这个循环(int i=l;i>=startNode;i--)进行完了
//i的值为startNode-1说明右子树不存在,所以只有在r>startNode才存在右子树
right= test(sequence,l+1,r);
}
完整代码
public class VerifySquenceOfBST {
public boolean VerifySquenceOfBST2(int [] sequence) {
boolean flag = false;
if (sequence.length==0) return false;
flag=test(sequence,0,sequence.length-1);
return flag;
}
public boolean test(int []sequence,int startNode,int endNode ){
//首先找到第一个比跟节点小的节点的位置,
int l=endNode-1;
if(startNode==endNode)
return true;
for(;l>=startNode;l--){//从右往左查找,第一个比endNode小的就是左子树的根节点索引
if(sequence[endNode]>sequence[l]){
break;
}
}
for (int i=l;i>=startNode;i--){
if(sequence[endNode]<sequence[i]){
return false;
}
}
boolean left=true;
if(l>0){
left= test(sequence,startNode,l);
}
//那么右子树的根节点,如果存在的话是第一个比根节点大的节点
int r=endNode-1;
for (;r>=startNode;r--){
if(sequence[r]>sequence[endNode]) break;
}
boolean right=true;
if(r>startNode){
right= test(sequence,l+1,r);
}
return right&&left;
}
}
class test{
public static void main(String[] args) {
VerifySquenceOfBST bst = new VerifySquenceOfBST();
int [] a ={7,8,6,12,16,14,10};
int [] a1 ={11,2,10};
System.out.println(bst.VerifySquenceOfBST2(a1));
}
}