返回
身为程序员,必须刷的 LeetCode 题目:二叉树的直径
前端
2023-12-25 21:31:42
导言
对于每一位心怀抱负的程序员而言,LeetCode 都是一座必经的试炼场。在这个平台上,解决一道道精心设计的算法题,不仅能磨炼我们的思维,还能检验我们对于数据结构和算法的掌握程度。今天,我们就来深入探讨一道经典的 LeetCode 题目:二叉树的直径。
何为二叉树的直径?
二叉树的直径是指树中任意两个结点之间的最长路径长度。这条路径可以经过任意结点,甚至可以折返。例如,对于下图所示的二叉树,其直径为 9:
1
/ \
2 3
/ \ / \
4 5 6 7
解题思路
求解二叉树直径的经典方法是采用递归算法。具体步骤如下:
- 对于每个结点,计算其左右子树的最大深度。
- 对于每个结点,计算其左右子树最大深度的和。如果该和大于当前最大直径,则更新最大直径。
- 返回以该结点为根的子树的最大深度。
递归实现
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 正是一个绝佳的平台,让我们不断磨炼技艺,向更高的编程境界进发。