字节跳动面试分享004

275 阅读2分钟

字节高频面试题( 543. 二叉树的直径 - 力扣(LeetCode)

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

题的意思是:给你一个数求这个树的某两个节点的最大距离

示例 : 给定二叉树 :

          1
         / \
        2   3
       / \     
      4   5    

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

解题思路: (二叉树递归)

对给的根节点root来说有两种情况:第一种就是:两个点的最大距离在root的两侧,距离也会途经root;第二种就是:两个点都在root的一侧,距离也不经过root

第一种情况:

1 / \ 2 3 / 4

这个树的最大距离为3(4 -> 2 -> 1 -> 3),与root(1)有关,此时思路为:

root的最大距离 等于 左节点的高度 与 右节点的高度 之和。(如此时左节点高度为2,右节点高度为1)

第二种情况:

      2   
       \    
        5 
       / \    
      7   6  
     /  \   \
    4     5   9

这个树的最大距离为4(4 -> 7 -> 5 -> 6 -> 9),与root(2)无关,此时思路为:

root的最大距离 等于 右节点的最大距离;又因为也可能

           2
         /
        5 
       / \    
      7   6  
     /  \   \
    4     5   9

所以root的最大距离等于左节点的最大距离 与 右节点的最大距离 的最大值

我们需要递归的是最大距离与高度,我们建立这个类:

    public static class Info{
        public int maxDistance;  //最大距离
        public int height;          //高度
        public Info(int m, int h) {
            maxDistance = m;
            height = h;
        } 
    }

递归方法:

public static Info Dig(TreeNode root) {
        if (root == null) {              //如果为空,最大距离和最大高度都为0
            return new Info(0, 0);
        }
        Info left = Dig(root.left);     //获得左子树的,最大距离和高度
        Info right = Dig(root.right);   //获得右子树的,最大距离和高度
        int height = Math.max(left.height,right.height) + 1;  //更新root的高度
        
        int p1 = Math.max(left.maxDistance,right.maxDistance);      //当第二种情况最大距离不经过root时
        int p2 = left.height + right.height;                //第一种情况最大距离经过root时
        int MaxDistance = Math.max(p1,p2);              //取两种方法的最大值
        return new Info(MaxDistance,height);
    }

完整代码:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int diameterOfBinaryTree(TreeNode root) {
        return Dig(root).maxDistance;
​
    }
    public static class Info{
        public int maxDistance;
        public int height;
        public Info(int m, int h) {
            maxDistance = m;
            height = h;
        } 
    }
    public static Info Dig(TreeNode root) {
        if (root == null) {
            return new Info(0, 0);
        }
        Info left = Dig(root.left);
        Info right = Dig(root.right);
        int height = Math.max(left.height,right.height) + 1;
        
        int p1 = Math.max(left.maxDistance,right.maxDistance);
        int p2 = left.height + right.height;
        int MaxDistance = Math.max(p1,p2);
        return new Info(MaxDistance,height);
    }
}

\