树形DP(二叉树动态规划)套路总结,一招鲜吃遍天

随便来一道二叉树的题目,比如说,判断二叉树是否是搜索二叉树?
所谓搜索二叉树,就是每个节点的左孩子都小于它,右孩子都大于它。

树形DP第一步

分析题目要求,选取任意一个普通节点,看看判断题目要求需要其左右孩子提供哪些条件?
比如这道题,根据搜索二叉树的定义,任意一个节点,需要大于左孩子的最大值,同时小于右孩子的最小值,这样才算是满足定义,同时,左右孩子本身还需要是搜素二叉树,因此,根据题目要求,总结出,这题需要左右孩子提供的三个数据:
1.是否是搜索二叉树
2.最小值
3.最大值
将上述左右孩子需要的返回结果,封装成一个数据结构保存,也可以不封装,在递归方法中返回也行。

树形DP第二步

写递归函数,此时,递归函数只需要考虑三件事:
第一,判断一下递归结束的位置,写出递归出口。

        if(node==null){
            return null;
        }

第二,将上述左右孩子的返回方法当作黑盒来看,返回的结果直接使用就行了。

        ReturnData leftData= BST(node.left);
        ReturnData rightData= BST(node.right);

第三,利用左右孩子返回结果,实现自己的逻辑,并继续向上返回。

        int min=node.value;
        int max=node.value;
        boolean isBst;
        //判断是否合格
        if((leftData==null||(leftData.isBST&&leftData.max<node.value))
                &&(rightData==null||(rightData.isBST&&rightData.min>node.value))){
            isBst=true;
        }else {
            return new ReturnData(false,min,max);
        }
        //求最小值
        if(leftData!=null){
            min=Math.min(leftData.min,node.value);
        }
        //求最大值
        if(rightData!=null){
            max=Math.max(rightData.max,node.value);
        }
        return new ReturnData(isBst,min,max);

完整实例代码:

    public static ReturnData  BST(Node  node){
        if(node==null){
            return null;
        }
        ReturnData leftData= BST(node.left);
        ReturnData rightData= BST(node.right);
        int min=node.value;
        int max=node.value;
        boolean isBst;
        if((leftData==null||(leftData.isBST&&leftData.max<node.value))
                &&(rightData==null||(rightData.isBST&&rightData.min>node.value))){
            isBst=true;
        }else {
            return new ReturnData(false,min,max);
        }
        if(leftData!=null){
            min=Math.min(leftData.min,node.value);
        }
        if(rightData!=null){
            max=Math.max(rightData.max,node.value);
        }
        return new ReturnData(isBst,min,max);
    }
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值