1 问题描述
给定一颗二叉树,计算其直径。树的直径是树的最长路(图论中的定义,表示二叉树内任意两个结点中路径最大的值)。
2 代码实现
2.1 递归实现
二叉树用递归比迭代容易很多,首先,我们明确一点,二叉树的直径所在的路不一定经过根节点,也就是说,可能直径存在于某颗子树内,因此,我们需要知道每一颗子树的直径,同时,还要知道这颗子树的高。这样,对于一颗二叉树,其直径有是max(d_l, d_r, h_l+h_r+2)
,这里的d_l, d_r
分别表示其左、右子树的直径,h_l, h_r
则是左、右子树的高。因此,很容易就能用递归写出结果:
# Definition for a binary tree node.
# 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:
d = 0
if root is not None:
d, _, _ = self.check(root)
return d
def check(self, root: TreeNode) -> (int, int, int):
if root is None:
d = 0
ll = -1
lr = -1
else:
ld, lll, llr = self.check(root.left)
ll = max(lll, llr) + 1
rd, llr, lrr = self.check(root.right)
lr = max(llr, lrr) + 1
d = max([ld, rd, ll + lr])
return d, ll, lr
时间复杂度 O ( n ) O(n) O(n),只需要遍历各个结点一次;空间复杂度 O ( n ) O(n) O(n),极端情况下需要调用堆栈 n n n次。