繁体   English   中英

此代码如何工作以找到二叉树的最小深度?

[英]How does this code work to find the Minimum Depth of Binary Tree?

我从https://leetcode.com/discuss/37282/simple-python-recursive-solution-bfs-on-80ms看到此代码

这是答案

给定二叉树,找到其最小深度。

最小深度是沿距根最短路径的节点数

节点到最近的叶节点。

class Solution:
        # @param {TreeNode} root
        # @return {integer}
        def minDepth(self, root):
            if not root:
                return 0

            nodes = [(root, 1)]
            while nodes:
                node, curDepth = nodes.pop(0)
                if node.left is None and node.right is None:
                    return curDepth
                if node.left:
                    nodes.append((node.left, curDepth + 1))
                if node.right:
                    nodes.append((node.right, curDepth + 1))

所以我的困惑是,假设节点1具有节点2和节点3作为其.left和.right子代,那么堆栈将是[(node 2,someDepth),(node 3 someDepth)]。 然后,由于堆栈仅弹出列表的最后一个元素,因此(节点3 someDepth)将被解压缩,而节点2被完全忽略。 因此,在节点2没有子节点而节点3有子节点的情况下,使用节点3进行后续迭代是否不对呢?

你所缺少的是

nodes.pop(0)

弹出第0个元素。

因此,您在这里错了:

然后,因为堆栈只会弹出列表的最后一个元素,所以...

想象一棵二叉树:

            1
          /    \
        2        3
     /   \     /   \
    4     5   6      7
 /   \      /   \   /
8     9    10   11 12

这里的状态空间将更改为(为简单起见,节点被命名为其内容编号):

# Before 1st iteration.
nodes = [(1, 1)]

# 1st iteration.
node, curDepth = 1, 1
nodes = [(2, 2), (3, 2)]

# 2nd iteration.
node, curDepth = 2, 2
nodes = [(3, 2), (4, 3), (5, 3)]

# 3rd iteration.
node, curDepth = 3, 2
nodes = [(4, 3), (5, 3), (6, 3), (7, 3)]

# 4th iteration.
node, curDepth = 4, 3
nodes = [(5, 3), (6, 3), (7, 3), (8, 4), (9, 4)]

# 5th iteration.
node, curDepth = 5, 3
# Here if node.left is None and node.right is None becomes True and curDepth i.e. 3 is returned.

可以看出,对节点进行了(树的)广度处理,因此它是一个BFS。

递归解决方案更容易理解。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    # @param {TreeNode} root
    # @return {integer}
    def minDepth(self, root):
        if root is None:
            return 0

        if root.left is None:
            return 1 + self.minDepth(root.right)

        if root.right is None:
            return 1 + self.minDepth(root.left)

        return 1 + min(self.minDepth(root.left), self.minDepth(root.right))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM