返回

身为程序员,必须刷的 LeetCode 题目:二叉树的直径

前端

导言

对于每一位心怀抱负的程序员而言,LeetCode 都是一座必经的试炼场。在这个平台上,解决一道道精心设计的算法题,不仅能磨炼我们的思维,还能检验我们对于数据结构和算法的掌握程度。今天,我们就来深入探讨一道经典的 LeetCode 题目:二叉树的直径。

何为二叉树的直径?

二叉树的直径是指树中任意两个结点之间的最长路径长度。这条路径可以经过任意结点,甚至可以折返。例如,对于下图所示的二叉树,其直径为 9:

            1
          /   \
         2     3
        / \   / \
       4   5 6   7

解题思路

求解二叉树直径的经典方法是采用递归算法。具体步骤如下:

  1. 对于每个结点,计算其左右子树的最大深度。
  2. 对于每个结点,计算其左右子树最大深度的和。如果该和大于当前最大直径,则更新最大直径。
  3. 返回以该结点为根的子树的最大深度。

递归实现

def diameter_of_binary_tree(root):
  if not root:
    return 0

  left_depth = max_depth(root.left)
  right_depth = max_depth(root.right)

  # 计算以当前结点为根的子树的最大深度
  max_depth_of_subtree = max(left_depth, right_depth) + 1

  # 计算以当前结点为根的子树的最大直径
  max_diameter_of_subtree = left_depth + right_depth + 1

  # 计算全局最大直径
  global_max_diameter = max(max_diameter_of_subtree, global_max_diameter)

  return max_depth_of_subtree

辅助函数:计算结点的最大深度

def max_depth(node):
  if not node:
    return 0

  left_depth = max_depth(node.left)
  right_depth = max_depth(node.right)

  return max(left_depth, right_depth) + 1

示例

对于上文给出的二叉树,我们可以得到以下结果:

root = 1
left_depth = max_depth(root.left) = 3
right_depth = max_depth(root.right) = 4
max_diameter_of_subtree = left_depth + right_depth + 1 = 8
global_max_diameter = max(max_diameter_of_subtree, global_max_diameter) = 8
return max_depth_of_subtree = 4

因此,该二叉树的直径为 8。

总结

二叉树的直径是一个经典的算法问题,涉及到递归、深度优先搜索和路径长度计算。通过掌握其解题思路和实现方法,程序员可以进一步提升自己的算法能力。而 LeetCode 正是一个绝佳的平台,让我们不断磨炼技艺,向更高的编程境界进发。