簡體   English   中英

從Python中的列表列表創建二叉樹

[英]Create Binary tree from list of lists in 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])
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得到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擁有201.3的孩子,第2行中有100的孩子,但是第2行中70.4的孩子100和49.6的孩子(共享100)。

有什么建議么?

編輯:在len()和從列表值(錯誤列表)創建節點時出錯。 似乎仍然有錯誤。

似乎正在運作

使用它來打印@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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM