我从看到此代码
https://leetcode.com/discuss/37282/simple-python-recursive-solution-bfs-o-n-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进行后续迭代是否不对呢?
python大神给出的解决方案
你所缺少的是
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。