📅  最后修改于: 2023-12-03 15:28:40.498000             🧑  作者: Mango
本问题是在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)。
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
无