[LeetCode] 543. Diameter of Binary Tree 二叉树的直径
Given a binary tree, you need to compute the length of the diameter of the tree. The diameter of a binary tree is the length of the longest path between any two nodes in a tree. This path may or may not pass through the root.
Example:
Given a binary tree
1 / \ 2 3 / \ 4 5
Return 3, which is the length of the path [4,2,1,3] or [5,2,1,3].
Note: The length of path between two nodes is represented by the number of edges between them.
给一个二叉树,计算二叉树的直径,直径是任意两个节点之间的最长路径。
解法1: traverse every node to get max of leftDepth, then rightDepth, then add those 2 at every node, calculate the max depth by helper. Complexity: Time O(N^2) Space O(N^2)
解法2:find out the max of leftDepth & rightDepth while at each node, meanwhile update the total max. Complexity: Time O(N) Space O(N)
最长路径有两种情况:
1. 最长条路径经过根节点,那么只需要找出根节点的左右两棵子树的最大深度然后相加即可。
2. 最长路径没有经过根节点,那么只需要找出根节点的左子树或者根节点的右子树作为根的最长路径度即可。递归调用,自底向上查找子树的深度,如果某一个左子树与右子树深度之和大于当前纪录的直径,那么替换为当前直径,递归完成之后即可找出直径。
Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public class Solution { int max = 0 ; public int diameterOfBinaryTree(TreeNode root) { if (root == null ) return 0 ; max = Math.max(max, helper(root.left) + helper(root.right)); diameterOfBinaryTree(root.left); diameterOfBinaryTree(root.right); return max; } public int helper(TreeNode root){ if (root == null ) return 0 ; return 1 + Math.max(helper(root.left), helper(root.right)); } } |
Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public class Solution { int max = 0 ; public int diameterOfBinaryTree(TreeNode root) { maxDepth(root); return max; } public int maxDepth(TreeNode root){ if (root == null ) return 0 ; int left = maxDepth(root.left); int right = maxDepth(root.right); max = Math.max(max, left + right); return 1 + Math.max(left, right); } } |
Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class Solution { int depth = 0 ; public int diameterOfBinaryTree(TreeNode root) { search(root); return depth; } private int search(TreeNode root) { if (root == null ) { return 0 ; } int left = search(root.left); int right = search(root.right); if (depth < left + right) { depth = left + right; } return left > right ? left + 1 : right + 1 ; } } |
Python:
1 2 3 4 5 6 7 8 9 10 11 | class Solution(): def diameter( self , root): if not root: return 0 res = self .depth(root.left) + self .depth(root.right) return max (res, max ( self .diameter(root.left), self .diameter(root.right))) def depth( self , node): if not node: return 0 return 1 + max ( self .depth(node.left), self .depth(node.right)) |
Python:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class Solution(): def __init__( self ): self . max = 0 def diameter( self , root): self .helper(root) return self . max def helper( self , root): if not root: return 0 left = self .helper(root.left) right = self .helper(root.right) self . max = max ( self . max , left + right) return 1 + max (left, right) |
Python:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | def height(node): if node is None : return 0 ; return 1 + max (height(node.left), height(node.right)) def diameter(root): if root is None : return 0 ; lheight = height(root.left) rheight = height(root.right) ldiameter = diameter(root.left) rdiameter = diameter(root.right) return max (lheight + rheight, max (ldiameter, rdiameter)) |
Python:
1 2 3 4 5 6 7 8 9 10 11 12 13 | class Solution( object ): def diameterOfBinaryTree( self , root): """ :type root: TreeNode :rtype: int """ def depth(root, diameter): if not root: return 0 , diameter left, diameter = depth(root.left, diameter) right, diameter = depth(root.right, diameter) return 1 + max (left, right), max (diameter, 1 + left + right) return depth(root, 1 )[ 1 ] - 1 |
C++: perfect solution , runtime = 26 ms
1 2 3 4 5 6 7 8 9 10 11 12 13 | class Solution7 { public : int diameterOfBinaryTree(TreeNode *root) { if (!root) return 0; int res = depthOfNode(root->left) + depthOfNode(root->right); return max(res, max(diameterOfBinaryTree(root->left), diameterOfBinaryTree(root->right))); } int depthOfNode(TreeNode *node) { if (!node) return 0; return max(depthOfNode(node->left), depthOfNode(node->right)) + 1; } }; |
类似题目:
[LeetCode] 104. Maximum Depth of Binary Tree 二叉树的最大深度
All LeetCode Questions List 题目汇总
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架