簡體   English   中英

Python 非二叉樹廣度優先發現代碼

[英]Python code to do breadth-first discovery of a non-binary tree

我的問題:我有一個開始的已知根節點和一個我試圖找到最短路徑的特定其他目標節點。 我正在嘗試編寫 Python 代碼來實現迭代深化廣度優先搜索算法,直到某個最大深度(比如 5 個頂點)。

但是,有兩個功能(我相信)使這個問題與我迄今為止能夠找到的幾乎所有其他 SO 問題和/或在線教程不同:

  1. 我還完全不知道樹的結構:我所知道的是根節點和目標節點都存在,許多其他未知節點也是如此。 根節點和目標節點可以相隔一個頂點、5 個、10 個等。此外,樹不是二叉樹:任何節點都可以沒有、一個或多個兄弟節點。

  2. 當我成功找到從根節點到目標節點的路徑時,我需要返回它們之間的最短路徑。 (我見過的大多數解決方案都涉及返回定位節點所需的整個遍歷順序,而我不需要。)

我 go 如何實現這個? 我的直接想法是嘗試某種形式的遞歸,但這似乎更適合深度優先搜索。

TLDR:在下面的示例樹中(為丑陋的設計道歉),我想按字母順序從 Root 到 Target 遍歷它。 (這應該導致算法跳過字母 K 和 L,因為它會在 J 之后立即找到目標節點。)我希望 function 返回:

[Root, B, E, H, Target]

在此處輸入圖像描述

您基本上是在尋找 Dijkstra 算法。 Dijkstra 算法采用廣度優先搜索讓您找到到達目標的最短路徑。 為了檢索從原點到節點的最短路徑,所有需要存儲的是每個發現的節點的父節點

假設這是您的樹節點:

class TreeNode:
    def __init__(self, value, children=None, parent=None):
        self.value = value
        self.parent = parent
        self.children = [] if children is None else children

這個 function 返回從樹根節點到目標節點的路徑:

from queue import Queue

def path_root2target(root_node, target_value):
    def build_path(target_node):
        path = [target_node]
        while path[-1].parent is not None:
            path.append(path[-1].parent)
        return path[::-1]
    q = Queue()
    q.put(root_node)
    while not q.empty():
        node = q.get()
        if node.value == target_value:
            return build_path(node)
        for child in node.children:
            child.parent = node
            q.put(child)
    raise ValueError('Target node not found')

例子:

>>> D = TreeNode('D')
>>> A = TreeNode('A', [D])
>>> B = TreeNode('B')
>>> C = TreeNode('C')
>>> R = TreeNode('R', [A, B, C])
>>> path_root2target(R, 'E')
ValueError: Target node not found
>>> [node.value for node in path_root2target(R, 'D')]
['R', 'A', 'D']

如果要返回節點值(而不是節點本身,則只需相應地修改build_path function 即可。

暫無
暫無

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

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