(一)问题描述
543. 二叉树的直径 - 力扣(LeetCode)543. 二叉树的直径 - 给你一棵二叉树的根节点,返回该树的 直径 。二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。两节点之间路径的 长度 由它们之间边数表示。 示例 1:[https://assets.leetcode.com/uploads/2021/03/06/diamtree.jpg]输入:root = [1,2,3,4,5]输出:3解释:3 ,取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。示例 2:输入:root = [1,2]输出:1 提示: * 树中节点数目在范围 [1, 104] 内 * -100 <= Node.val <= 100https://leetcode.cn/problems/diameter-of-binary-tree/description/?envType=study-plan-v2&envId=top-100-liked
给你一棵二叉树的根节点,返回该树的 直径 。
二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root
。
两节点之间路径的 长度 由它们之间边数表示。
示例 1:
输入:root = [1,2,3,4,5] 输出:3 解释:3 ,取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。示例 2:
输入:root = [1,2] 输出:1
提示:
- 树中节点数目在范围
[1, 104]
内 -100 <= Node.val <= 100
(二)解决思路
这个问题有个大坑,是直径很容易被理解成左子树最大深度+右子树最大深度,但这是错误的。乍一看是这样的,给的两个测试用例也能通过,但是一提交就发现出错了。
把这个二叉树可视化出来是这样的(这个图片来源于leetcode用户sammy贡献的题解,不是我自己画的),其中蓝色的线是经过根节点的左右子树最大高度和,红色的线是实际的最长路径,也就是直径,可以看到红色长度是8,蓝色长度是7。
但实际上这个最大路径也是-9那个节点的最大左子树高度加最大右子树高度的和,不难看出,直径就是各个节点最大左子树高度和最大右子树高度之和的最大值。因此用一个全局变量来保存并更新每次计算后的最大值就可以了。
/*** 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 {int ans=1;public int diameterOfBinaryTree(TreeNode root) {depth(root);return ans-1;}public int depth(TreeNode root){if(root==null) return 0;int left=depth(root.left);int right=depth(root.right);ans=Math.max(ans,left+right+1);return Math.max(left,right)+1;}}