📜  门| GATE CS 2021 |设置 2 |第 54 题(1)

📅  最后修改于: 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)$。