【树】力扣543:二叉树的直径

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

注意:两结点之间的路径长度是以它们之间边的数目表示。

示例:

输入:image
输出: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.的下场:
image

时间复杂度:O(N),其中 N 为二叉树的节点数,即遍历一棵二叉树的时间复杂度,每个结点只被访问一次。

空间复杂度:O(Height),其中 Height 为二叉树的高度。由于递归函数在递归过程中需要为每一层递归函数分配栈空间,所以这里需要额外的空间且该空间取决于递归的深度,而递归的深度显然为二叉树的高度,并且每次递归调用的函数里又只用了常数个变量,所以所需空间复杂度为 O(Height) 。

posted @   Vonos  阅读(49)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示