簡體   English   中英

Python中樹的遞歸函數

[英]Recursive function for trees in Python

我正在嘗試在 Python 中創建一個函數,該函數采用樹的任意節點,並根據節點給出的列表填充列表。

鑒於以下繪制錯誤的樹:

樹

例如,如果我們從節點 5 開始,我們應該得到:

  • 包含具有相同父節點的所有節點的列表,包括我們從(4 和 5)開始的節點
  • 任何子節點,但不是它們的子節點 (6)。
  • 父節點和任何具有相同父節點的父節點,以及它們的父節點等,直到我們到達根節點,但不包括根節點(在這種情況下只有 2 和 3,但如果樹更深,我們開始更低,這里會有更多。

並且節點應該在一個列表列表中結束,每個深度一個列表。

python中的節點:

nodes = [
    {'id': 1, 'parent': None},
    {'id': 2, 'parent': 1},
    {'id': 3, 'parent': 1},
    {'id': 4, 'parent': 2},
    {'id': 5, 'parent': 2},
    {'id': 6, 'parent': 5},
    {'id': 7, 'parent': 6},
    {'id': 8, 'parent': 3}
]

我們只能看到父母,不能看到孩子,但遺憾的是,這是我必須使用的數據格式。

因此,如果我們采用節點 5,我們希望最終得到一個看起來像這樣的節點列表:

nl = [
    [{'id': 6, 'parent': 5}],
    [{'id': 4, 'parent': 2}, {'id': 5, 'parent': 2}],
    [{'id': 2, 'parent': 1}, {'id': 3, 'parent': 1}],
]

這是我到目前為止的代碼。 我認為遞歸函數可能是最簡單的方法。 不幸的是,它似乎沒有像我認為的那樣做,顯然我做錯了。 並且這段代碼甚至沒有考慮獲取我根本不完全確定如何處理的子節點,除了可能處理之后會容易得多。

node_list = []

def pop_list(nodes=None, parent=None, node_list=None):
    if parent is None:
        return node_list
    node_list.append([])
    for node in nodes:
        if node['parent'] == parent:
            node_list[-1].append(node)
        if node['id'] == parent:
            parent = node['parent']
    return pop_list(nodes, parent, node_list)

print pop_list(nodes, 5, node_list)

這是輸出:

[[], [{'id': 3, 'parent': 1}], []]

不完全確定我哪里出錯了。

問題就在這里

    if node['id'] == parent:
        parent = node['parent']

當前parent將被parent覆蓋。

此外,您應該在函數末尾添加return node_list ,或者使用node_list作為結果。

def pop_list(nodes=None, parent=None, node_list=None):
    if parent is None:
        return node_list
    node_list.append([])
    for node in nodes:
        if node['parent'] == parent:
            node_list[-1].append(node)
        if node['id'] == parent:
            next_parent = node['parent']

    pop_list(nodes, next_parent, node_list)
    return node_list

>>> print pop_list(nodes, 5, node_list)
[[{'id': 6, 'parent': 5}], [{'id': 4, 'parent': 2}, {'id': 5, 'parent': 2}], [{'id': 2, 'parent': 1}, {'id': 3, 'parent': 1}]]  
def processNode(bp, space=''):
    if ('name' in bp[0].keys() ):
        print( space + bp[0]['name'])
    if ('subNodesTitle' in bp[0].keys()):
        print( bp[0]['subNodesTitle'])
        processNode( bp[0]['subNodes'],space=space+' ')
    if (len(bp) > 1):
        processNode( bp[1:],space=space )
processNode(root)

這個函數可以通過一個不平衡的樹遞歸,

暫無
暫無

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

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