想法:
二叉树的直径是指:树中任意两个节点之间的最大距离,意思是有最多的edges。
关于edges我们可以想到树的另一个概念,就是height(高度)。height是指由树叶leaf到某个特定节点之间最大的edges数目。
我们可以利用深度优先算法,找出每一个节点的height。height可以想成左右子树的height的最大值,加上1(这个节点与左子树或右子树之间有一条edge)。
如果一个节点不存在左子树或者右子树,那么我们把这个不存在的左子树或右子树的height定为-1。
最后,我们考虑直径。直径会等于左子树的height加上右子树的height,再加上2(因为有两条edges分别由节点连接左子树和右子树)。再在递归的过程中一直求最大值。
代码:
# 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: Optional[TreeNode]) -> int:
self.diameter = 0
def dfs_height(root):
if not root:
return -1
leftHeight = dfs_height(root.left)
rightHeight = dfs_height(root.right)
self.diameter = max(self.diameter, leftHeight + rightHeight + 2)
return 1 + max(leftHeight, rightHeight)
dfs_height(root)
return self.diameter