图的遍历BFS、DFS【Python】

算法作业

1.以邻接表的存储方式,实现图的BFS和DFS遍历,并分析复杂度。(100分)
输入:
第一行输入两个数m, n,表示图有m个顶点(所有顶点的字母各不相同),n条边;
接下来n行每行输入两个顶点,表示这两个顶点之间有边相连;
最后一行输入遍历开始的顶点
输出:
从遍历开始的顶点出发,分别输出图的BFS和DFS遍历的结果(若某个节点存在多种遍历方式,则按照字母表顺序来进行遍历,即输出只有一种结果)
例子:
输入:
3,3
A,B
A,C
B,C
A
输出:
A,B,C
A,B,C
得分标准:
(1)以邻接表的存储方式实现BFS,并得到正确的输出结果获得40分
(2)以邻接表的存储方式实现DFS,并得到正确的输出结果获得40分
(3)实验报告和分析占20分
8,10
1,2
1,5
2,6
3,6
3,4
6,7
7,8
from collections import defaultdict


def sort_V(V):
    for k,v in V.items():
        for i in range(len(v)):
            for j in range(len(v) - i - 1):
                if ord(v[j]) > ord(v[j+1]):
                    v[j], v[j+1] = v[j + 1], v[j]
    return V

# BFS
def BFS(V, start):
    # 路径(已访问过的点)、队列
    visited, queue =  [], []
    queue.append(start)

    while len(queue) > 0:
        start = queue[0]
        visited.append(start)
        queue.pop(0)
        for v in V[start]:
            if v not in visited and v not in queue :
                queue.append(v)

    return visited


def DFS(V,start,visit):
    if len(visit) == len(V):
        return
    for v in V[start] :
        if v not in visit:
            visit.append(v)
            DFS(V,v,visit)


if __name__ == "__main__":
    m, n = map(int, input("请输入点和边的个数,以逗号分隔:").split(","))
    print(m, n)
    print("按序输入:相邻两点,以逗号分隔:")

    # 邻接表
    V = defaultdict(list)
    for i in range(n):
        v1, v2 = input("").split(",")
        V[v1].append(v2)
        V[v2].append(v1)

    start = input("请输入起点:")
    start_D = start
    V_sorted = sort_V(V)
    print(V_sorted)
    V_D = V_sorted.copy()

    print("BFS:", BFS(V_sorted, start))

    visit = [start_D]
    DFS(V_D, start_D, visit)
    print("DFS:", visit)
4,7
3,7
4,8
8
['8', '4', '7', '3', '6', '2', '1', '5']
['8', '4', '7', '3', '6', '2', '1', '5']
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Python中的二叉树遍历可以使用广度优先搜索(BFS)和深度优先搜索(DFS)两种方法。 BFS(广度优先搜索)是一种逐层遍历二叉树的方法。从根节点开始,按照层级顺序依次访问每个节点,先访问左子节点,再访问右子节点。具体实现可以使用队列来辅助实现。以下是BFS的实现方式: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def bfs(root): if not root: return [] queue = [root] result = [] while queue: node = queue.pop(0) result.append(node.val) if node.left: queue.append(node.left) if node.right: queue.append(node.right) return result ``` DFS深度优先搜索)是一种先访问根节点,然后递归地访问左子树和右子树的方法。DFS有三种常见的遍历方式:前序遍历、中序遍历和后序遍历。以下是DFS的实现方式: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def dfs_preorder(root): if not root: return [] result = [] result.append(root.val) result += dfs_preorder(root.left) result += dfs_preorder(root.right) return result def dfs_inorder(root): if not root: return [] result = [] result += dfs_inorder(root.left) result.append(root.val) result += dfs_inorder(root.right) return result def dfs_postorder(root): if not root: return [] result = [] result += dfs_postorder(root.left) result += dfs_postorder(root.right) result.append(root.val) return result ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值