树形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: 三叉链表是一种特殊的链表结构,可以用来构造二叉树。在三叉链表中,每个节点有三个指针,分别指向其左子节点、右子节点和父节点。通过这种结构,可以方便地进行二叉树的遍历和操作。 基于前序中序或中序后序遍历序列,可以动态打印树形叉树。具体实现方法如下: 1. 根据前序遍历序列和中序遍历序列构造二叉树。 2. 根据中序遍历序列和后序遍历序列构造二叉树。 3. 对于每个节点,输出其值,并递归输出其左子树和右子树。 通过这种方法,可以动态地打印出树形叉树,方便观察和理解二叉树的结构和特性。 ### 回答2: 三叉链表是一种特殊的链表,它每个节点有三个指针域,分别指向其左孩子节点、右孩子节点和父节点。用三叉链表构造二叉树的基本思路是:对于每个节点,可以通过其父节点的指针确定其在二叉树中的位置,并通过其左孩子和右孩子指针找到其左右子树。 基于前序中序构造二叉树的过程如下:首先在前序遍历序列中定位根节点,然后在中序遍历序列中找到根节点的位置,并划分出左子树和右子树的中序遍历序列。接着递归构造左子树和右子树,重复以上过程,最终构造出完整的二叉树。 基于前序中序、中序后序动态打印树形叉树的过程可以分为两步。第一步是构造二叉树,可以按照上述方法进行构造。第二步是根据树的结构动态打印树形叉树。 具体来说,首先在递归构造二叉树的过程中,可以在每个节点处输出当前节点的值。然后可以在每个节点处添加缩进符号,用于表示该节点在树中的相对位置,例如可以在递归构造左子树时添加一个缩进符号,表示该节点是其父节点的左孩子,在递归构造右子树时再删除该缩进符号。最后可以通过遍历整个二叉树,将每个节点对应的缩进符号和值输出到控制台上,就可以得到一个动态打印的树形叉树。 综上所述,使用三叉链表构造二叉树并基于前序中序、中序后序动态打印树形叉树主要包括以下几个步骤:确定二叉树的节点结构、递归构造二叉树、在构造过程中输出节点值和缩进符号、遍历整个二叉树并输出动态打印的树形结构。这一过程需要使用递归和树的遍历技巧,需要仔细分析每个节点在树形结构中的位置,以确保输出结果正确。 ### 回答3: 三叉链表是一种常用于构建二叉树的数据结构,它是将每个节点拆分成三个部分:左孩子指针、右孩子指针和父亲指针。在使用前序中序或中序后序算法创建二叉树时,三叉链表是非常有用的。 基于前序中序构建二叉树的方法是,首先确定前序序列中的第一个节点为根节点,然后在中序序列中找到这个根节点的位置,并将中序序列划分成左子树和右子树。在递归的过程中,先处理左子树部分,然后在左子树中寻找下一个根节点,重复以上步骤。再处理右子树,直到全部处理完毕。 基于中序后序构建二叉树的方法是,首先确定中序序列中的最后一个节点为根节点,然后在后序序列中找到这个根节点的位置,并将后序序列划分成左子树和右子树。在递归的过程中,先处理右子树部分,然后在右子树中寻找下一个根节点,重复以上步骤。再处理左子树,直到全部处理完毕。 在打印树形叉树时,我们可以使用递归的方法,按层次打印每个节点的信息。例如,对于每个节点,我们先打印出其值,然后递归打印左子树和右子树。在打印左子树时,我们需要根据节点的深度添加空格,以保证输出的格式清晰。 总的来说,基于三叉链表构造二叉树是一种方便而且高效的方式,可以实现前序中序和中序后序构建,同时通过递归打印树形叉树,可以更加直观地了解二叉树的结构,方便开发者进行相关操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值