算法与数据结构——树形dp套路(java)(左程云b站课程总结)

树形dp套路

使用前提:

如果题目求解目标是S规则,则求解流程可以定成以每一个节点为头节点的子树在S规则下的每一个答案,并且最终答案一定在其中

dp套路总结:

  1. 以某个节点X为头节点的子树中,分析答案有哪些可能性,并且这种分析是以X的左子树、X的右子树和X整棵树的角度来考虑可能性的
  2. 根据第一步分析的可能性,列出所有需要的信息
  3. 合并第二步的信息,对左树和右树提出同样的要求,并写出信息结构
  4. 设计递归函数,递归函数是处理以X为头节点的情况下的答案,包括设计递归的basecase,默认直接得到左树和右树的所有信息,以及把可能性做整合,并且要返回第三步的信息结构这四个小步骤

二叉树节点间的最大距离问题

image-20220625141715824

分类讨论:

  1. 头节点不参与的情况
    1. 左树上的最大距离
    2. 右树上的最大距离
  2. 头节点参与的情况
    1. 左树上最远节点到右树上最远节点的距离(左树高度+右树高度+1)

总结:取三者最大值

左树和右树都需要返回两个信息:最大距离和高度

public class Info{
    public int maxDistance;
    public int height;
    public Info(int md,int h){
        this.maxDistance=md;
        this.height=h;
    }
}

public Info process(Node x){
    if(x==null){
        return new Info(0,0);
    }
    Info leftInfo=process(x.left);
    Info rightInfo=process(x.right);
    
    int p1=leftInfo.maxDistance;
    int p2=rightInfo.maxDistance;
    int p3=leftInfo.height+rightInfo.height+1;
    int maxDistance=Math.max(p3,Math.max(p1,p2));
    int height=Math.max(leftInfo.height,rightInfo.height)+1;
    return new Info(maxDistance,height);
}

力扣543:二叉树的直径

给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。

示例 :
给定二叉树

      1
     / \
    2   3
   / \     
  4   5    

返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。

注意:两结点之间的路径长度是以它们之间边的数目表示。

class Solution {
    public int diameterOfBinaryTree(TreeNode root) {
        Info res=process(root);
        return res.maxDistance;
    }

    public class Info{
        int height;
        int maxDistance;
        public Info(int height,int maxDistance){
            this.height=height;
            this.maxDistance=maxDistance;
        }
    }

    public Info process(TreeNode node){
        if(node==null){
            return new Info(0,0);
        }
        Info leftInfo=process(node.left);
        Info rightInfo=process(node.right);
        int p1=leftInfo.maxDistance;
        int p2=rightInfo.maxDistance;
        int p3=leftInfo.height+rightInfo.height;//这里与例题的不同 不用加1 求的最远距离是指边的数量
        int height=Math.max(leftInfo.height,rightInfo.height)+1;
        int maxDistance=Math.max(p3,Math.max(p1,p2));
        return new Info(height,maxDistance);
    }
}

派对的最大快乐值

算法与数据结构——树形dp套路(java)(左程云b站课程总结)_第1张图片

算法与数据结构——树形dp套路(java)(左程云b站课程总结)_第2张图片

以X为头节点的多叉树,分两种情况

  1. X参与:X的快乐值+a、b、c整颗子树(abc不来)的最大快乐值
  2. x不参与:a参与的整颗子树的最大快乐值和a不参与的整颗子树的最大快乐值的较大值+b的+c的

总结:返回信息:abc三个子树的来和不来时子树的最大快乐值

算法与数据结构——树形dp套路(java)(左程云b站课程总结)_第3张图片

public class Employee{
    public int happy;
    public List<Employee> nexts;
}

public int maxHappy(Employee boss){
    Info headInfo=process(boss);
    return Math.max(headInfo.laiMaxHappy,headInfo.buMaxHappy);
}

public class Info{
    public int laiMaxHappy;
    public int buMaxHappy;
    public Info(int lai,int bu){
        this.laiMaxHappy=lai;
        this.buMaxHappy=bu;
    }
}

public Info process(Employee x){
    if(x.nexts.isEmpty()){//x是基层员工
        return new Info(x.happy,0);
    }
    int lai=x.happy;
    int bu=0;
    for(Employee next:x.nexts){
        Info nextInfo=process(next);
        lai+=nextInfo.buMaxHappy;
        bu+=Math.max(nextInfo.laiMaxHappy,nextInfo.buMaxHappy);
    }
    return new Info(lai,bu);
}

你可能感兴趣的:(数据结构与算法,算法,数据结构,java)