Leetcode Link: 543. 二叉树的直径 - 力扣(LeetCode) (leetcode-cn.com)
题目
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。

关于一个二叉树直径的提示
前提这是一个二叉树,如果,这里说的是如果,他的直径横跨左右树,那么一定过根节点,如果不是横跨,那么一定横跨某一个子树的根节点。 仔细想想,这应该是二叉树的左右子树的深度相加,比较每一颗子树的左右子树的深度和,找到最深的那个。
解法一
思路:DFS 需要在每个节点:获取左右子树的深度,计算当前树的横跨直径,和最大直径比较,并返回当前树的深度
因此,后序位置操作。
题解:
class Solution:
def diameterOfBinaryTree(self, root: Optional[TreeNode]) -> int:
if not root:
return 0
# 辅助全局变量,最大深度
max_diameter = 0
def traverse(node):
nonlocal max_diameter
if not node:
# 这里,None节点的深度应该是-1,而不是0
return -1
left = traverse(node.left)
right = traverse(node.right)
# 需要把左右子树和根节点的连线算作两个直径的单位
# 由于none节点是-1深度,所以这里可以直接+2
max_diameter = max(left+right+2, max_diameter)
# 返回当前树的深度,需要考虑从当从左右子树的深度计算当前树的深度要+1
return max(left, right)+1
traverse(root)
return max_diameter