簡體   English   中英

如何遞歸遍歷樹並在python中創建訪問節點的列表

[英]How to recursively traverse a tree and create a list of visited nodes in python

我定義了一個類Tree,該類由以下TreeNode列表組成:

class Tree(object):
    def __init__(self, name, nodes):
        self.name = name
        self.nodes = nodes

class TreeNode(object):
    def __init__(self, name, parent):
        self.name = name
        self.parent = parent

如您所見,對於每個TreeNode,我僅定義一個父節點。 但是,我想編寫一個Tree方法,為我提供一個名為targetNodeName的目標節點的所有父節點的列表(輸出列表還應包括targetNodeName本身)。 為此,我編寫了一個遞歸函數,該函數迭代直到找到沒有父節點的節點(即根節點),同時建立一個名為result的列表。

def allParents(self, targetNodeName, results):
    currentNode = next((node for node in self.nodes if node.name == targetNodeName))
    results.append(currentNode.name)
    if (currentNode.parent == None):
        print results
        return results
    else:
        return results.append(self.allParents(currentNode.parent, results))

但是我的遞歸函數不能按預期執行。 我舉一個例子,我首先定義一個三層的7節點樹,然后調用allParents方法以獲取節點'N7'的所有父節點,即['N7','N3','N1']。

# create nodes
myTreeNodes = []
myTreeNodes.append(TreeNode(name = 'N1', parent = None))
myTreeNodes.append(TreeNode(name = 'N2', parent = 'N1'))
myTreeNodes.append(TreeNode(name = 'N3', parent = 'N1'))
myTreeNodes.append(TreeNode(name = 'N4', parent = 'N2'))
myTreeNodes.append(TreeNode(name = 'N5', parent = 'N2'))
myTreeNodes.append(TreeNode(name = 'N6', parent = 'N3'))
myTreeNodes.append(TreeNode(name = 'N7', parent = 'N3'))

myTree = Tree(name = 'ST1', nodes = myTreeNodes)

a = myTree.allParents(targetNodeName = 'N7', results = [])
print a

> ['N7', 'N3', 'N1']
> None

盡管它會打印出正確的父節點列表-請注意函數中的“ debug”打印命令-(即['N7','N3','N1']),但該函數返回None,這意味着我已下車該函數無返回值。 我怎樣才能解決這個問題?

使用調試器逐步完成該方法對於確定代碼采用的路徑非常有幫助。

使用此方法,我可以看到該方法最初位於else分支之后,只有對self.allParents的子調用才導致print語句。 問題出在results.append ,它總是返回None而不是列表。

a = []
b = a.append(3)
assert a == [3]
assert b is None

最簡單的解決方案是將行拆分為原始results.append ,然后return results

用途當值等於無或不檢查。 allParents方法可以簡化如下:

def allParents(self, targetNodeName):
    currentNode = next(node for node in self.nodes
                       if node.name == targetNodeName)
    if currentNode.parent is None:
        return [currentNode.name]
    else:
        return [currentNode.name] + self.allParents(currentNode.parent)

暫無
暫無

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

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