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

启发和联系