【问题标题】:Preorder Binary Tree traversal Recursive method前序二叉树遍历递归方法
【发布时间】: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: 条件会失败。

以下是我的问题。

  1. node2.left为None后,如何遍历node2.right? (因为如果 start: 条件失败)
  2. 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”节点。
  • 现在我明白了!当我把它想象成一个函数中的一个函数时,我能够掌握它!非常感谢蒂姆的努力!

标签: python preorder


【解决方案1】:

看看这个,看看有没有帮助:

class Node(object):
    def __init__(self, value):
        self.value = value
        self.left = None
        self.right = None
    def addleft(self,value):
        self.left = Node(value)
    def addright(self,value):
        self.right = Node(value)
    def preorder_print(self, start, traversal='', depth=0): 
        print( " "*depth, start.value if start else "None" )
        if start:
            traversal += (str(start.value) + "-")
            print(' '*depth, "check left")
            traversal = self.preorder_print(start.left, traversal, depth+1)
            print(' '*depth, "check right")
            traversal = self.preorder_print(start.right, traversal, depth+1)
        return traversal

base = Node(8)
base.addleft(4)
base.left.addleft(2)
base.left.addright(1)
base.addright(5)
base.right.addright(6)

print( base.preorder_print( base ) )

输出:

 8
 check left
  4
  check left
   2
   check left
    None
   check right
    None
  check right
   1
   check left
    None
   check right
    None
 check right
  5
  check left
   None
  check right
   6
   check left
    None
   check right
    None
8-4-2-1-5-6-

【讨论】:

    猜你喜欢
    • 2020-09-25
    • 1970-01-01
    • 2013-05-12
    • 2016-05-01
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多