Python中的树形图搜索算法

2023-04-11 00:00:00 python 算法

树形图搜索算法是一种常见的搜索算法,它可以用于解决很多问题,例如寻路、人工智能、游戏等等。这种算法通过构建一棵树形图,并通过遍历该树来寻找目标。下面将详细介绍Python中的树形图搜索算法。

代码演示:

class Node(object):
    """定义一个节点类,表示树形图的节点"""

    def __init__(self, data):
        self.data = data  # 数据
        self.children = []  # 孩子节点


class Tree(object):
    """定义一个树形图"""

    def __init__(self, root):
        self.root = root  # 根节点

    def add_node(self, parent_node, child_node):
        """添加一个节点"""
        parent_node.children.append(child_node)

    def bfs(self, target):
        """广度优先搜索"""
        queue = [self.root]  # 用队列存储待遍历节点
        while queue:
            node = queue.pop(0)  # 取出队列中的第一个节点
            if node.data == target:  # 如果目标值是当前节点,则返回该节点
                return node
            else:
                queue += node.children  # 将当前节点的孩子节点加入队列

        return None  # 如果没有找到目标值,则返回None

    def dfs(self, target):
        """深度优先搜索"""
        stack = [self.root]  # 用栈存储待遍历节点
        visited = []  # 用来存储已经遍历过的节点
        while stack:
            node = stack.pop()  # 取出栈顶节点
            if node.data == target:  # 如果目标值是当前节点,则返回该节点
                return node
            elif node not in visited:  # 如果当前节点未被访问过
                visited.append(node)  # 将当前节点添加到已访问列表
                stack += node.children  # 将当前节点的孩子节点加入栈

        return None  # 如果没有找到目标值,则返回None


# 构建一个树形图
root_node = Node('p')
tree = Tree(root_node)

node1 = Node('i')
node2 = Node('d')
node3 = Node('a')
node4 = Node('n')
tree.add_node(root_node, node1)
tree.add_node(root_node, node2)
tree.add_node(node1, node3)
tree.add_node(node1, node4)

# 深度优先搜索
node = tree.dfs('n')
if node:
    print("在树形图中找到了目标节点:", node.data)
else:
    print("在树形图中未找到目标节点。")

# 广度优先搜索
node = tree.bfs('i')
if node:
    print("在树形图中找到了目标节点:", node.data)
else:
    print("在树形图中未找到目标节点。")

输出结果:

在树形图中找到了目标节点: n
在树形图中找到了目标节点: i

在上面的代码中,我们定义了一个节点类和一个树形图类,然后使用它们来构建一个树形图。在上面的例子中,我们添加了一个根节点和四个孩子节点,并使用深度优先搜索和广度优先搜索来查找目标节点。

在树形图搜索算法中,广度优先搜索是先遍历当前节点的所有孩子节点,然后依次遍历这些孩子节点的孩子节点,直到找到目标节点或者遍历完整个树。而深度优先搜索则是先遍历深度方向上的节点,直到找到目标节点或者遍历到叶子节点。

相关文章