【问题标题】:Printing binary search tree nodes using inorder traversal (recursion) in Python在 Python 中使用中序遍历(递归)打印二叉搜索树节点
【发布时间】:2017-12-20 03:04:46
【问题描述】:

我正在尝试在二叉搜索树上实现一个简单的中序遍历方法。

            10
          /    \
         5      15
          \
           8

我想打印整个树,但我只打印了前 3 个节点。我的问题是:

-- 如何修复我的“有序”打印方法? “插入”方法工作正常。 -- inorder 方法的基本条件是什么?打印完所有节点后如何知道停止?

 class Tree:
  def __init__(self, value):
    self.node = value
    self.leftChild = None
    self.rightChild  = None

  def insert(self, value):
    if self.node is None:
        self.node = value
        return True
    if self.node is not value:
        if self.node > value:
            if self.leftChild  is None:
                self.leftChild  = Tree(value)
            else:
                return self.leftChild.insert(value)
        if self.node < value:
            if self.rightChild  is None:
                self.rightChild  = Tree(value)
            else:
                 return self.rightChild.insert(value)
    else:
        return False

  def inorder(self):
      if self:  
          if self.leftChild:
              return self.leftChild.inorder()
          print self.node
          if self.rightChild:
              return self.rightChild.inorder()


tree = Tree(10)
tree.insert(5)
tree.insert(8)
tree.insert(15)
tree.inorder()


> 5
  8
  10

【问题讨论】:

    标签: python recursion binary-search-tree tree-traversal inorder


    【解决方案1】:

    在return self.leftChild.inorder() 中的return 在self 和self.rightChild 可以处理之前结束对inorder 的调用。删除returns,该方法无论如何都不会返回任何内容。

    【讨论】:

    • 非常感谢!就是这样!关于我的基本条件问题,我对这些递归感到非常困惑。让我这样问:假设我们的树只有以下 4 个节点: Root 是 10:10 的 Left Child 是 5:10 的 Right Child 是 15:5 的 Right Child 是 8。 Inorder() 将从 Root 开始并调用 self. leftChild.inorder(),即'5'。现在节点“5”将再次调用 self.leftChild.inorder(),但由于它没有左子节点,将执行“打印 self.node”。接下来,它将调用 self.rightChild.inorder() 将其引导到 8。由于 8 没有正确的孩子,它将执行“打印 self.node”。
    • 问题:从节点 8 开始,inorder() 怎么知道它应该一直回到 10?它如何知道所有节点何时都被访问过?
    • "node ‘5’ will call self.leftChild.inorder()" 不,if self.leftChild 意味着它甚至不会尝试那样做。顺便说一句if self 毫无意义,删除它。对于您的问题:递归不是魔术,它只是函数调用。当一个函数调用完成时,调用它的函数会从中断处继续。 Python 跟踪堆栈中帧中的所有函数调用。我建议单步调试器。 Here's a simple one。它不知道如何做任何你没有看到或不熟悉的事情。它只是按照你的吩咐去做。
    • 您的评论和您分享的令人敬畏的调试器链接消除了我的许多疑虑!谢谢!
    猜你喜欢
    • 2014-05-07
    • 2020-09-25
    • 2012-11-13
    • 1970-01-01
    • 2013-05-12
    • 2023-03-14
    • 1970-01-01
    • 2018-02-25
    相关资源
    最近更新 更多