📜  门| Gate IT 2007 |问题4(1)

📅  最后修改于: 2023-12-03 15:28:40.498000             🧑  作者: Mango

门| Gate IT 2007 |问题4

简介

本问题是在Gate IT 2007考试中出现的,是一道经典的编程问题,要求求解一个二叉树的最长直径。

问题描述

给定一颗二叉树,请你计算它的直径长度。一棵二叉树的直径长度定义为任意两个节点路径长度中的最大值。

输入格式

输入的第一行包含一个整数 N,表示二叉树的节点数。

接下来 N 行,每行对应一个节点,其中第 i 行包含两个整数 Li,Ri,表示编号为 i 的节点的左儿子、右儿子的编号,如果其左儿子或右儿子为空,则对应的数字是 0。

输出格式

输出一个整数,表示这棵树的直径长度。

数据范围

1≤N≤10^5

示例

输入:

5
2 3
1 0
4 5
0 0
0 0

输出:

4
解题思路

求解一颗二叉树的最长直径可以转化为求解所有节点的最长距离。具体做法是递归遍历每一个节点,对于每个节点,分别求它的左子树和右子树的最长距离,然后将这两部分加起来作为当前节点的最长距离,如果当前节点的最长距离比全局最长距离大,则更新全局最长距离。

具体的实现可以先写一个 helper 函数,这个函数的作用是计算以某一个节点为根节点的子树的最长距离。然后再写一个递归遍历函数,对于每个节点,调用 helper 函数计算其最长距离,然后和全局最长距离比较并更新即可。

时间复杂度是 O(n)。

Python代码实现
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

class Solution:
    def diameterOfBinaryTree(self, root: TreeNode) -> int:
        self.ans = 0

        def helper(node):
            if not node:
                return 0
            
            left = helper(node.left)
            right = helper(node.right)
            self.ans = max(self.ans, left+right)
            return max(left, right) + 1

        helper(root)
        return self.ans
参考资料