【问题标题】:Right way to construct a binary tree?构造二叉树的正确方法?
【发布时间】:2017-05-27 00:10:20
【问题描述】:

假设我们有一个类BinaryTree定义如下(不能修改):

class BinaryTree:
    def __init__(self, value = None):
        self.value = value
        if self.value is not None:
            self.left_node = BinaryTree()
            self.right_node = BinaryTree()
        else:
            self.left_node = None
            self.right_node = None

我有一个堆栈,由数字和'+'组成,例如,

stack = ['1', '2', '+', '3', '4', '5', '+', '+', '+']

现在我想构造二叉树。规则如下: 从右到左,根是'+'。 然后如果字符是'+',扩展分支, 否则,我们将数字从 left_node 添加到 right_node

按照我弹出列表中最后一个元素的顺序,详细的流程说明如下:

t = BinaryTree('+')
t.left_node = BinaryTree('+')
t.left_node.left_node = BinaryTree('+')
t.left_node.left_node.left_node = BinaryTree('5')
t.left_node.left_node.right_node = BinaryTree('4')
t.left_node.right_node = BinaryTree('3')
t.right_node = BinaryTree('+')
t.right_node.left_node = BinaryTree('2')
t.right_node.right_node = BinaryTree('1')

所以最终树的视觉表示是这样的

我知道我需要使用递归和控制结构来解决这个问题,但我不确定如何将其应用于在树中添加节点。

如果有什么需要澄清的,请告诉我,我们将不胜感激。

【问题讨论】:

  • 这看起来像是一个标准的介绍性数据结构问题。如果是家庭作业,您可能会发现 this Meta Stack Overflow topic 对提出这个问题很有用。
  • 嗨,马修,感谢您的提醒。是的,这确实是我目前所坚持的家庭作业的一部分。
  • 既然是家庭作业,你正在使用哪些算法课本(或者手头有上一堂课的课本)?科门?塞奇威克?
  • 哦,我们没有教科书,讲师解释了二叉树,但这个挑战需要相当多的递归知识

标签: python recursion binary-tree


【解决方案1】:

我会做以下事情:

  • 定义一个使用列表构建节点并返回列表剩余内容的函数:

    def 点(l):

    t = BinaryTree(l[-1])
    if l[-1] == '+':
        left, rest = noding(l[:-1])
        t.left_node = left
        right, rest = noding(rest)
        t.right_node = right
        return t, rest
    if l[-1] != '+':
        return t, l[-1]
    

这有点生硬,我没有时间真正彻底地思考它,尤其是在处理 None 时。

编辑:不要返回 None,而是像以前一样返回 l[:-1]。

【讨论】:

  • 感谢 Marc 的提示,这对我很有帮助,因为我一直认为必须在 return 语句之后调用递归函数。您的回答很棒,但是,仅出于这个问题的目的,我会在处理列表时将 l[-1] 稍微更改为 l.pop() 。这对我很有帮助,非常感谢!
猜你喜欢
  • 1970-01-01
  • 2021-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
相关资源
最近更新 更多