我正在做LeetCode问题543。二叉树直径:
给定二叉树的
root
,返回树的直径的长度二叉树的diameter是树中任意两个节点之间最长路径的长度。该路径可以通过也可以不通过CCD_ 2。
两个节点之间路径的长度由它们之间的边数表示。
我以为我解决了这个问题,但我的代码不适用于这个测试用例。你能告诉我我缺了什么吗?
输入:
[4,-7,-3,null,null,-9,-3,9,-7,-4,null,6,null,-6,-6,null,null,0,6,5,null,9,null,null,-1,-4,null,null,null,-2]
预期输出:
8
我的代码输出7
我的代码
class Solution:
def diameterOfBinaryTree(self, root: TreeNode) -> int:
def dfs(node:TreeNode, depth:int):
if not node:
return depth
depth += 1
left_depth = dfs(node.left, depth)
right_depth = dfs(node.right, depth)
return max(left_depth, right_depth)
l = dfs(root.left, 0)
r = dfs(root.right, 0)
return l + r
您的代码假设最长的路径总是通过根。然而,代码挑战已经包含了关于这一点的提示:
。。。该路径可以通过也可以不通过
root
由表示的图形
[4,-7,-3,null,null,-9,-3,9,-7,-4,null,6,null,-6,-6,null,null,0,6,5,null,9,null,null,-1,-4,null,null,null,-2]
是:
____ 4 ___
/
-7 ____-3___
/
___-9___ -3
/ /
9 -7 -4
/ /
__6__ -6 -6
/ / /
0 6 5 9
/ /
-1 -4 -2
现在可以看到,-1和-2之间的路径有8条边,而通过根的最长路径只有7条(-1到-7(。
因此,你必须修改你的算法,以寻找";最高";最长路径中的节点不是根。
提示1:
不仅两个子树的高度起作用,而且两个子树的直径也起作用。这些是不同的衡量标准。
提示2:
当通过节点的最长路径的长度由其两个子树的高度确定时,仍然需要将其与为这两个子树计算的直径进行比较。哪个更大应该是当前节点的直径。
扰流板实现:
class Solution: def diameterOfBinaryTree(self, root: Optional[TreeNode]) -> int: if not root: return -1 leftDia = self.diameterOfBinaryTree(root.left) rightDia = self.diameterOfBinaryTree(root.right) leftHeight = root.left.val if root.left else -1 rightHeight = root.right.val if root.right else -1 # (ab)use the node's value for storing its height. root.val = 1 + max(leftHeight, rightHeight) return max(leftDia, rightDia, 2 + leftHeight + rightHeight)