Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Python中的列表列表创建二叉树_Python - Fatal编程技术网

从Python中的列表列表创建二叉树

从Python中的列表列表创建二叉树,python,Python,我需要从列表列表中创建一个二叉树。我的问题是一些节点重叠(从某种意义上说,一个节点的左子节点是另一个节点的右子节点),我想将它们分开 我复制了重叠的节点并创建了一个列表,但是我缺少了一些东西。我使用的代码是: self.root = root = BNodeItem(values[0][0], 0) q = list() q.append(root) # make single tree list tree_list = list() tree_list.append(values[0][0]

我需要从列表列表中创建一个二叉树。我的问题是一些节点重叠(从某种意义上说,一个节点的左子节点是另一个节点的右子节点),我想将它们分开

我复制了重叠的节点并创建了一个列表,但是我缺少了一些东西。我使用的代码是:

self.root = root = BNodeItem(values[0][0], 0)
q = list()
q.append(root)

# make single tree list
tree_list = list()
tree_list.append(values[0][0])
for i in xrange(1, len(values[0])):
    ll = [i for i in numpy.array(values)[:, i] if i is not None]
    # duplicate the values
    p = []
    for item in ll[1:-1]:
        p.append(item)
        p.append(item)
    new_ll = list()
    new_ll.append(ll[0])
    new_ll.extend(p)
    new_ll.append(ll[-1])
    tree_list.extend(new_ll)
# fix tree
for ind in xrange(len(tree_list)/2 - 1):
    eval_node = q.pop(0)
    eval_node.left = BNodeItem(tree_list[2*ind + 1], 0)
    eval_node.right = BNodeItem(tree_list[2*ind + 2], 0)
    q.append(eval_node.left)
    q.append(eval_node.right)
“values”变量如下所示(其中0通常为
None
):

例如,第1行中的141.9在第2行中有子元素201.3和100,但第2行中的子元素70.4有子元素100和49.6(100是共享的)

有什么建议吗

编辑:在len()和从列表值创建节点时出错(列表错误)。似乎还有一个bug

似乎起作用了

使用此选项打印@Arthur解决方案中的树:

class Node():
    def __init__(self, value):
        self.value = value

        self.leftChild = None
        self.rightChild= None
    def __str__(self, depth=0):
        ret = ""
        if self.leftChild is not None:
            ret += self.leftChild.__str__(depth + 1)
        ret += "\n" + ("                                     " * depth) + str(self.value)
        if self.rightChild is not None:
            ret += self.rightChild.__str__(depth + 1)
        return ret

下面是一个解决方案,它返回一个
节点
对象,该对象具有左和右子对象,允许您使用大多数树解析算法。如果需要,可以轻松地向父节点添加引用

data2 = [[1,2,3],
         [0,4,5],
         [0,0,6]]

def exceptFirstColumn(data):
    if data and data[0] :
        return [ row[1:] for row in data ]
    else :
        return []

def exceptFirstLine(data):
    if data :
        return data[1:]

def left(data):
    """ Returns the part of the data use to build the left subTree """
    return exceptFirstColumn(data)

def right(data):
    """ Returns the part of the data used to build the right subtree """
    return exceptFirstColumn(exceptFirstLine(data))
class Node():
    def __init__(self, value):
        self.value = value

        self.leftChild = None
        self.rightChild= None

    def __repr__(self):
        if self.leftChild != None and self.rightChild != None :
            return "[{0} (L:{1} | R:{2}]".format(self.value, self.leftChild.__repr__(), self.rightChild.__repr__())
        else:
            return "[{0}]".format(self.value)

def fromData2Tree(data):    
    if data and data[0] :
        node = Node(data[0][0])

        node.leftChild = fromData2Tree(left(data))
        node.rightChild= fromData2Tree(right(data))

        return node

    else :
        return None

tree = fromData2Tree(data2)
print(tree)
此代码给出以下结果:

[1 (L:[2 (L:[3] | R:[5]] | R:[4 (L:[5] | R:[6]]]
这是请求的下列树。在你的数据上测试它,它是有效的。现在试着理解它是如何工作的;)


输入的是您提供给我们的文件文本示例吗?
[1 (L:[2 (L:[3] | R:[5]] | R:[4 (L:[5] | R:[6]]]
   +-----1-----+
   |           |
+--2--+     +--4--+
|     |     |     |
3     5     5     6