【树】力扣543:二叉树的直径
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。
注意:两结点之间的路径长度是以它们之间边的数目表示。
示例:
输入:
输出:3
它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]
一条路径的长度为该路径经过的节点数减一,所以求直径(即求路径长度的最大值)就是求路径经过节点数的最大值减一,等效于 该路径的根结点的左右子树最大高度之和。
因此这道题也是 力扣104. 二叉树的最大深度 的变形。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def diameterOfBinaryTree(self, root: Optional[TreeNode]) -> int:
self.maxd = 0
depth(root) # 从树的根节点开始递归函数depth
return self.maxd
# 求出以各结点为根结点的树的最大深度
def depth(node):
if not node:
return 0
left, right = depth(node.left), depth(node.right) # 左右子树的最大深度
self.maxd = max(left + right, self.maxd) # 每个结点都要去判断该结点的左子树 + 右子树的深度(即当前直径)是否大于self.maxd,更新最大值
return 1 + max(left, right)
全局变量不加self.
的下场:
时间复杂度:O(N),其中 N 为二叉树的节点数,即遍历一棵二叉树的时间复杂度,每个结点只被访问一次。
空间复杂度:O(Height),其中 Height 为二叉树的高度。由于递归函数在递归过程中需要为每一层递归函数分配栈空间,所以这里需要额外的空间且该空间取决于递归的深度,而递归的深度显然为二叉树的高度,并且每次递归调用的函数里又只用了常数个变量,所以所需空间复杂度为 O(Height) 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异