我对二叉树直径问题的求解给出了错误的结果

  • 本文关键字:错误 结果 二叉树 问题 tree
  • 更新时间 :
  • 英文 :


我正在做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)

相关内容

  • 没有找到相关文章