【Leetcode】543. 二叉树的直径

181 阅读1分钟

题目描述

在这里插入图片描述

// 543. 二叉树的直径

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


题解

/**
 * 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;
 *     }
 * }
 */


// 直接递归
// 还记得【Leetcode】104. 二叉树的最大深度,和这道题有异曲同工之处,
// 本题实际就是找左右子树的深度最大和,深度最大和可以通过递归+贪心的方式
// ,通过不断更新res找到。
// 
// 解答基本上跟【Leetcode】104. 二叉树的最大深度 很像,稍微修改一下就行。
// 定义答案保存位res,
// 定义depth函数,如果root为null,直接返回0,否则,调用depth(root.left)结果
// 赋给int left,调用depth(root.right)结果赋给int right,取res和right+left
// 中的最大值,贪心地赋给res。最后函数还是老样子,返回left和right中最大的
// 那个再+1。
// 
// 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
// 内存消耗:38.5 MB, 在所有 Java 提交中击败了39.54%的用户
class Solution {
    int res = 0;
    public int diameterOfBinaryTree(TreeNode root) {
		if (root == null)
			return res;
		depth(root);
		return res;
    }

    public int depth(TreeNode root) {
        if (root == null) {
            return 0;
        }
		int left = depth(root.left);
		int right = depth(root.right);
		res = Math.max(res, left + right);
		return Math.max(left, right) + 1;
    }
}