【问题标题】:Creating a binary tree创建二叉树
【发布时间】:2017-07-01 08:33:24
【问题描述】:

我正在尝试从平面列表创建一棵树。我需要定义一个名为tree_from_flat_list 的函数。对于索引位置i的任何节点,左孩子存储在索引位置2*i,右孩子存储在索引位置2*i+1。 :

class BinaryTree:

    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None

    def get_left(self):
        return self.left

    def get_right(self):
        return self.right

    def set_left(self, tree):
        self.left = tree

    def set_right(self, tree):
        self.right = tree

    def set_data(self, data):
        self.data = data

    def get_data(self):
        return self.data

    def create_string(self, spaces): 
        info = ' ' * spaces + str(self.data) 
        if self.left != None: 
            info += '\n(l)' + self.left.create_string(spaces+4) 
        if not self.right == None: 
            info += '\n(r)' + self.right.create_string(spaces+4) 
        return info       

    def __str__(self): 
        representation = self.create_string(0) 
        return representation 

def tree_from_flat_list(node_list):
    if node_list != None:
        root_index = 1
        list1 = []
        list2 = []
        root = node_list[root_index]
        left_sub_tree = list1.append(node_list[2*root_index])
        right_sub_tree = list2.append(node_list[2*root_index+1])
        tree = BinaryTree(root)
        tree.set_left(tree_from_flat_list(left_sub_tree))
        tree.set_right(tree_from_flat_list(right_sub_tree))
        return tree

当我尝试运行这个时:

def test():
    flat_list = [None, 10, 5, 15, None, None, 11, 22]
    my_tree = tree_from_flat_list(flat_list)
    print(my_tree)

test()

我应该得到输出:

10
(l)    5
(r)    15
(l)        11
(r)        22

编辑:仍然坚持我应该为该功能做什么。任何帮助仍然很感激。

中间的空格数是树的高度,lr 表示它们是左孩子还是右孩子。这看起来像:

        10
       /  \
      5    15
          /  \
         11  22

但我只得到:

10

我应该如何编辑我的tree_from_flat_list 函数以使其正常工作。任何帮助表示赞赏。谢谢。

【问题讨论】:

  • 你能添加一些关于如何从列表中构造树的信息(以文本格式)吗?
  • 你能解释一下你的打印输出到底代表什么吗?应该从[None, 10, 5, 15, None, None, 11, 22] 生成的二叉树的结构究竟是什么?我可以开始做假设,但如果你从一开始就指定这一点会更好。
  • 另外,不要使用 getter 和 setter,这是 Python,而不是 Java。
  • 所以,根据您的规范,列表将始终以None? 开头
  • @EllenPage 那么左孩子的节点会去哪里寻找索引为 0 的节点呢?

标签: python recursion binary-tree


【解决方案1】:

您的问题的本质在于以下几行:

    left_sub_tree = list1.append(node_list[2*root_index])
    right_sub_tree = list2.append(node_list[2*root_index+1])

append 函数集不返回任何内容 - 它附加到列表中。这会将您的左右子树设置为None

【讨论】:

  • 这确实是我问题的本质。谢谢你为我指出。
  • 我仍然坚持这部分。我将如何去做,以便我将左树和子树设置为正确的值。
  • @L3viathan 的方法要简洁得多 - 尝试使用它吗?
【解决方案2】:

列表格式似乎是二进制堆的一种变体,其中元素可以是None。我认为您可以简化一下:

class BinaryTree(object):
    def __init__(self, label, left, right):
        self.label = label
        self.left = left
        self.right = right

def tree_from_flat_list(ls, index=1):
    if index < len(ls) and ls[index] is not None:
        left = tree_from_flat_list(ls, 2*index)
        right = tree_from_flat_list(ls, 2*index+1)
        return BinaryTree(ls[index], left, right)

我想知道为什么不将左右孩子存储在索引2*i+12*i+2 中,就像在二进制堆中一样;那么你不需要在开头有None

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-29
    • 2011-05-08
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多