gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:50:14 27 4
gpt4 key购买 nike

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

我复制了重叠的节点并创建了一个列表,但我遗漏了一些东西。我用来执行此操作的代码:

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)

“值”变量看起来像这样(我通常得到 0 None):

100   141.9068   201.3753   285.7651    405.5200    575.4603
0 70.4688 100 141.9068 201.3753 285.7651
0 0 49.6585 70.4688 100.0000 141.9068
0 0 0 34.9938 49.6585 70.4688
0 0 0 0 24.6597 34.9938
0 0 0 0 0 17.3774

例如,第 1 行中的 141.9 在第 2 行中有子代 201.3 和 100,但是 70.4 在第 2 行中有子代 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

最佳答案

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

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-----+
| |
+--2--+ +--4--+
| | | |
3 5 5 6

关于python - 从 Python 中的列表列表创建二叉树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29825715/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com