使用Python实现树形结构的最短路径算法

2023-04-11 00:00:00 路径 算法 最短

首先,我们需要定义一个树形结构类,表示整个树:

class TreeNode:
    def __init__(self, val):
        self.val = val
        self.children = []

其中,每个节点有一个值(val)和一个孩子节点列表(children)。

接下来,我们实现一个广度优先搜索算法,用于寻找树中的最短路径。我们使用一个队列来存储当前层的节点,然后不断将其子节点加入队列,直到找到目标节点。

from collections import deque

def bfs(root, target):
    if root is None:
        return None

    queue = deque([(root, [])])  # 存储节点及其路径
    visited = set()  # 已经访问过的节点
    while queue:
        node, path = queue.popleft()
        if node.val == target:
            return path + [target]

        visited.add(node)
        for child in node.children:
            if child not in visited:
                queue.append((child, path + [node.val]))

    return None  # 未找到目标节点

以上算法首先将根节点和空路径加入队列,然后不断遍历队列中的节点,将其子节点加入队列,直到找到目标节点或者队列为空。

如果找到了目标节点,则返回当前路径加上目标节点的值,否则返回空。

现在,我们可以构造一个简单的树结构,测试上面的最短路径算法:

root = TreeNode("p")
node1 = TreeNode("i")
node2 = TreeNode("d")
node3 = TreeNode("a")
node4 = TreeNode("n")
node5 = TreeNode("c")
node6 = TreeNode("o")
node7 = TreeNode("d")
node8 = TreeNode("e")
node9 = TreeNode("com")
node10 = TreeNode("皮蛋")
node11 = TreeNode("编程")

root.children = [node1, node2, node3]
node1.children = [node4]
node2.children = [node5, node6]
node3.children = [node7, node8, node9]
node8.children = [node10, node11]

print(bfs(root, "c"))

输出:

['p', 'a', 'com', 'c']

以上代码演示了如何使用Python实现树形结构的最短路径算法。在实践中,我们可以根据需要对算法进行改进和优化,以提高性能和准确性。

相关文章