• 2.11
    • max 取得是 max 和 l+r(直径)进行对比更新
class Solution {
    int maxD=0;
    public int diameterOfBinaryTree(TreeNode root) {
        dfs(root);
        return maxD;
    }
    public int dfs(TreeNode root){
        if(root==null) return 0;
        int lD = dfs(root.left);
        int rD = dfs(root.right);
        int allD=lD+rD;
        maxD = Math.max(allD,maxD);
        return Math.max(lD,rD)+1;
    }
}
  • 1.26

    • 得到左右长度,得到总长度,更新最长长度,传递给下一层长度
  • 1.16

    • 道心破碎,这就是8简单题吗
    • 思路对,但细节拉完了,左长度和右长度是由 dfs 的上一层得到的(从最底层网上传递)
    • 中间记录全局直径
    • 返回值返回左右其中的最大深度+1,因为是从上一个 root 根往下传的,需要加上 root 根到目前这个节点的长度
class Solution {
    int maxDepth=0;
    public int diameterOfBinaryTree(TreeNode root) {
        getmaxDepth(root);
        return maxDepth;
    }
    public int getmaxDepth(TreeNode root){
        if(root==null) return 0;
        int leftDepth = getmaxDepth(root.left);
        int rightDepth = getmaxDepth(root.right);
        int allDepth = leftDepth+rightDepth;
        maxDepth = Math.max(maxDepth,allDepth);
        return Math.max(leftDepth,rightDepth)+1;
    }
}
  • 11.11
    • 下面写的挺好,直径的本质左子树长度(max)➕右子树长度(max)
    • 在dfs的过程中记录左子树和右子树的长度,对比,返回时需要挑一个大的+1返回,因为本质还是节点的最长子树
class Solution {
    private int maxD = 0;          // 全局直径(边数)
 
    public int diameterOfBinaryTree(TreeNode root) {
        dfs(root);
        return maxD;
    }
 
    // 返回以 node 为根的子树最大深度
    private int dfs(TreeNode node) {
        if(node==null){return 0;};
        int r = dfs(node.right);
        int l = dfs(node.left);
        maxD = Math.max(maxD,r+l);
        return Math.max(r,l)+1;
 
    }
}
  • 本质为左边最长的长度+右边最长的长度
  • dfs返回值应该为int以返回左右各自的长度,依旧用Math.max更新最大长度,结束条件为node节点为null
  • maxD为全局的长度,return的是各自左右的长度,+1代表从node节点到底的长度,而不是node节点的子树到底的长度