我试图理解为什么当二叉树的一侧为None
时,找到二叉树最小深度的解决方案不起作用。
这里已经有一个问题要问-Why won't my solution work to find minimum depth of a binary tree?,但是那里的答案仍然让我听不懂。
我的实现代码如下。
class Solution:
def minDepth(self, root: 'TreeNode') -> 'int':
if root is None:
return 0
left = self.minDepth(root.left)
right = self.minDepth(root.right)
min_depth = min(left, right)
return 1 + min_depth
将最后一行修改为以下内容后,它将起作用。
if left == 0 or right == 0:
return 1 + left + right
return 1 + min_depth
我的问题是,为什么您需要检查一侧是否为None
,或者最后是否将它们全部加起来-return 1 + left + right
?
测试用例是
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
# [1, 2]
root = TreeNode(1)
root.left = TreeNode(2)
solution = Solution()
solution.minDepth(root)
我的代码返回1
,而该代码应返回2
。
编辑 树的深度定义为从树的根到叶节点的最短路径中的节点数。
答案 0 :(得分:1)
当您所在的节点上只有一个孩子时,则在您的第一个代码版本中,该节点的min_depth
将为0(因为其中一个递归调用将返回0)。
这确实是错误的,因为该节点不是叶子。仅当节点是叶子(没有子节点)时,才是正确的。
在您的示例中,根就是这样一个节点(有一个孩子)。这就是发生的情况:
minDepth(root)
被称为minDepth(root.left)
被称为minDepth(root.left.left) is called and returns 0, because it is
无人minDepth(root.left.right) is called and returns 0, because it is
无人min_depth = min(left, right)
的值为0 minDepth(root.left)
的返回值为1 minDepth(root.right)
被调用并返回0,因为它是None
min_depth = min(left, right)
的值为0,这是错误的。在left
或right
为0的情况下,您需要获取剩余孩子的minDepth
并加1。这就是为什么当您添加以下内容时起作用:
if left == 0 or right == 0:
return 1 + left + right