从嵌套列表和平面列表

时间:2016-02-11 21:19:26

标签: python tree

我想定义两个函数,一个用于从嵌套列表中打印出一个树,另一个用于从平面列表中打印一个树。

如果我们有列表,那么就可以了 [5, [10, None, None], [11, [2, None, None],[6, None, None]]], [None, 5, 10, 11, None, None, 2, 6],我们会生成一个看起来像

的树
 10
    5
    15
        11
        22 

这是二叉树实现

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 += self.left.create_string(spaces+4) 
    if not self.right == None: 
        info += self.right.create_string(spaces+4) 
    return info       

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

我基本上想将列表转换为树,因为二进制树类中有一个创建字符串函数

1 个答案:

答案 0 :(得分:0)

一个简单的递归函数允许您将嵌套列表创建为btree:

def create_tree(data):
    if not data:
        return data
    d, l, r = data
    btree = BinaryTree(d)
    btree.set_left(create_tree(l))
    btree.set_right(create_tree(r))
    return btree

>>> print(create_tree([10, [5, None, None], [15, [11, None, None],[22, None, None]]]))
10
(l)    5
(r)    15
(l)        11
(r)        22

虽然我个人会更新__init__()类的BinaryTree方法,可选择左右:

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

然后递归函数变为:

def create_tree(data):
    if not data:
        return data
    d, l, r = data
    return BinaryTree(d, create_tree(l), create_tree(r))

目前还不清楚从平面列表到树结构的映射。