JZ23 二叉搜索树的后序遍历序列

首先二叉搜索树满足的条件: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));
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值