当树的一侧为空时,查找二叉树的最小深度解决方案不起作用

时间:2019-02-16 07:29:45

标签: python python-3.x binary-tree

我试图理解为什么当二叉树的一侧为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

编辑 树的深度定义为从树的根到叶节点的最短路径中的节点数。

1 个答案:

答案 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,这是错误的。
  • ...。因此,最终返回值为1(错误)。

leftright为0的情况下,您需要获取剩余孩子的minDepth并加1。这就是为什么当您添加以下内容时起作用:

if left == 0 or right == 0:
    return 1 + left + right