【发布时间】:2021-07-26 10:18:27
【问题描述】:
我试图了解二叉树遍历 (PreOrder) 的实现。非递归方法很好,但在尝试理解递归方法时我完全迷失了。
代码:
def preorder_print(self, start, traversal): """Root->Left->Right"""
if start:
traversal += (str(start.value) + "-")
traversal = self.preorder_print(start.left, traversal)
traversal = self.preorder_print(start.right, traversal)
return traversal
二叉树
8
/ \
4 5
/ \ \
2 1 6
我的理解是在到达节点 2(8-4-2) 时,节点 2 的左侧是无。所以if start: 条件会失败。
以下是我的问题。
- node2.left为None后,如何遍历node2.right? (因为如果 start: 条件失败)
- node1之后,逻辑如何移动到node5哪个rootNode.right?
我对递归的理解很差,请帮忙!
【问题讨论】:
-
这里的关键是,当
if start失败时,你已经嵌套了三个调用。您将返回到调用您的实例。如果添加一些调试打印语句,它可能会变得清晰。添加“深度”参数并在递归调用中传递“深度+1”会更有帮助。然后你会看到“depth=3”处的失败只是回到“depth=2”处的调用并继续。 -
嗨,我试过你的代码它可以工作,但我在理解逻辑上有问题,即 Node2 左右都是无。当 left 为 None 时,在递归调用中 self.preorder_print(None,traversal) 将被传递正确吗?所以条件会失败,整个循环应该终止吗?
-
没有。 没有循环。都是线性的。当您到达节点 2 时,它将“2”添加到列表中,它为左侧调用
preorder_print(立即返回),然后它为右侧调用preorder_print(立即返回),然后退出返回下一级,即“4”节点。 -
现在我明白了!当我把它想象成一个函数中的一个函数时,我能够掌握它!非常感谢蒂姆的努力!