【问题标题】:python binary tree recursionpython二叉树递归
【发布时间】:2020-09-15 21:44:16
【问题描述】:
class Node:
    def __init__(self,value):
        self.value = value 
        self.right = None
        self.left = None

class Tree:
    def __init__(self,root):
        self.root = Node(root) 

    def print_tree(self):
        return self.preorder_print(self.root,"")

    def preorder_print(self,start,traversal):
        if start:
            print('step 1')
            traversal = self.preorder_print(start.left, traversal)
            print('step 2')
            traversal +=(str(start.value)+"-")
            print('step 3')
            traversal = self.preorder_print(start.right, traversal)
        return traversal


"""
             F
        B         G
    A      D        I
        C    E   H 

In- order print: A->B->C->D->E->F->G->H->I
"""


tree = Tree("F")
tree.root.left = Node("B")
tree.root.right = Node("G")
tree.root.right.right = Node("I")
tree.root.right.right.left = Node("H")

tree.root.left.left = Node("A")
tree.root.left.right = Node("D")
tree.root.left.right.left = Node("C")
tree.root.left.right.right = Node("E")
print(tree.print_tree())

我知道“第 1 步”递归会转到最左端,Node("A"),但是当到达 A 之后,

  1. func 是如何脱离递归的?它是否会进入下一行“第 2 步”?

  2. “第 1 步”中该遍历的返回值是多少?

【问题讨论】:

  • #2 中的“A”是什么?
  • @ScottHunter "A" 显然是Node("A")
  • 运行它时真的有效吗?您似乎从未在任何地方返回值,也从未进行任何形式的检查以查看左侧或右侧是否仍有节点。
  • @SeanPayne:都在那儿:return traversal 和 if start:。
  • @quamrana 谢谢。这里已经是深夜了。我花了几个小时调试。显然是时候停止工作了 xD

标签: python recursion binary-tree


【解决方案1】:
  1. 是的,有很多程序员在递归可视化方面遇到了困难。
  2. 是的,当递归到达Node A 时,递归确实有帮助。
  3. 该函数在if start: 语句处脱离递归(基本情况)。

顺便说一句,您发布的代码输出如下:A-B-C-D-E-F-G-H-I-

您的数据的基本情况示例如下:当代码输入preorder_print() 时,start 指代Node("A"),然后if start: 传递,下一条语句是traversal = self.preorder_print(start.left, traversal),传递start.left到下一个层次。

现在因为Node("A") 将left 和right 都设置为默认None,所以上面的调用是nop 并且只返回traversal,所以下一个语句是traversal += str(start.value) + "-",其中start.value 是 "A"。

同样,下一条语句traversal = self.preorder_print(start.right, traversal) 是nop,然后return traversal 退出此级别并上升一个级别。

现在我们发现自己回到了刚刚执行过traversal = self.preorder_print(start.left, traversal) 的self.preorder_print(),其中start 指的是Node("B"),start.left 指的是Node("A")。

【讨论】:

  • 对于您的第三个响应,当 func 退出递归时,它是否会移动到下一行,遍历 +=(str(start.value)+"-")?
  • break out of the recursion 是if start:,它跳过traversal = ... 部分并跳转到return traversal 并返回上一级,是的,大概是traversal += ...
  • 如果我错了,请纠正我。 traversal = self.preorder_print(start.left, traversal) 是一直到 Node(A) 的递归行。在下一个循环中,递归将在if start: 处中断,并将值A 返回到其父节点Node(B),比Node(A) 高一级,并将该值A 分配给变量traversal行traversal = self.preorder_print(start.left, traversal) ?
  • 1.对于Node(A) 是nop,这是否意味着traversal = self.preorder_print(start.left, traversal) 中的左侧变量traversal 标记了当前节点的位置,因此下一行traversal +=(str(start.value)+"-") 可以将start.value 作为A 连接到字符串? 2. funcreturn traversal 的最后一行我还是有点犹豫。它只是上一层吗?
  • 你想要chat吗?
猜你喜欢
  • 1970-01-01
  • 2021-07-03
  • 2019-04-17
  • 2016-04-19
  • 2014-03-29
  • 2010-12-07
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
相关资源
最近更新 更多