📅  最后修改于: 2023-12-03 15:42:12.895000             🧑  作者: Mango
这是 Gate CS 2021 的设置 2 中的第 54 题。该题目是关于树的问题,要求我们编写一个程序来计算二叉树的直径。
给定一棵二叉树,计算该树的直径。直径是树中任意两个节点之间最长路径的长度。这个路径不一定经过根节点。
例如,下图所示的二叉树的直径为 4(节点 3 到节点 5)。
1
/ \
2 3
/ \
4 5
为了计算二叉树的直径,我们需要计算每个节点的左子树高度与右子树高度之和,以及每个子树的直径,最后取出最长的路径。
具体的,我们采用递归的方式,对于每个节点,计算其左子树高度、右子树高度和左右子树的直径,我们可以用以下公式来计算:
h_left = 1 + max(height(node.left), height(node.left))
h_right = 1 + max(height(node.right), height(node.right))
diameter = h_left + h_right - 2
最后返回子树直径的最大值即可。
下面是 Python 3 代码的代码片段:
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def height(node):
if not node:
return 0
else:
return 1 + max(height(node.left), height(node.right))
def diameter(node):
if not node:
return 0
l_height = height(node.left)
r_height = height(node.right)
l_diam = diameter(node.left)
r_diam = diameter(node.right)
return max(l_height + r_height, max(l_diam, r_diam))
以上是计算二叉树直径的代码片段,其时间复杂度为 $O(n)$。