宽度优先搜索python_Python实现深度优先与广度优先

二叉树的两种遍历是数据结构的经典考察题目, 广度遍历考察队列结构, 深度遍历考察递归AAffA0nNPuCLAAAAAElFTkSuQmCC

二叉树

深度优先先序遍历(父, 左子, 右子) 0, 1, 3, 7, 8, 4, 9, 2, 5, 6

中序遍历(左子, 父, 右子) 7, 3, 8, 1, 9, 4, 0, 5, 2, 6

后序遍历(左子, 右子, 父) 7, 8, 3, 9, 4, 1, 5, 6, 2, 0"深度优先遍历"考察递归, 将子节点为空作为终止递归的条件

广度优先"广度优先遍历"考察队列的结构, 消除父节点(出队列,顺便打印), 添加子节点(进队列),当队列内元素个数为零, 完成遍历

添加元素AAffA0nNPuCLAAAAAElFTkSuQmCC

添加元素

广度优先遍历AAffA0nNPuCLAAAAAElFTkSuQmCC

广度优先遍历

深度优先AAffA0nNPuCLAAAAAElFTkSuQmCC

先序遍历

AAffA0nNPuCLAAAAAElFTkSuQmCC

中序遍历

AAffA0nNPuCLAAAAAElFTkSuQmCC

后续遍历

Python3 实现class Node(object):

"""初始化一个节点,需要为节点设置值"""

def __init__(self, val):

self.val = val

self.left = None

self.right = Noneclass BinaryTree(object):

"""

创建二叉树,完成

- 添加元素

- 广度遍历

- 深度遍历(先序遍历, 中序遍历, 后序遍历)

"""

def __init__(self):

self.root = None

pass

# 添加元素

def addNode(self, val):

# 创建队列结构存储结点

nodeStack = [self.root,]        # 如果根结点为空

if self.root == None:

self.root = Node(val)

print("添加根节点{0}成功!".format(self.root.val))            return

while len(nodeStack) > 0:            # 队列元素出列

p_node = nodeStack.pop()            # 如果左子结点为空

if p_node.left == None:

p_node.left = Node(val)

print("添加左:{0} ".format(p_node.left.val))                return

# 如果右子节点为空

if p_node.right == None:

p_node.right = Node(val)

print("添加右:{0} ".format(p_node.right.val))                return

nodeStack.insert(0, p_node.left)

nodeStack.insert(0, p_node.right)    # 广度遍历(中序: 先读父节点,再读左子节点, 右子节点)

def breadthFirst(self):

nodeStack = [self.root, ];        while len(nodeStack) > 0:

my_node = nodeStack.pop()

print("-->",my_node.val)            if my_node.left is not None:

nodeStack.insert(0, my_node.left)            if my_node.right is not None:

nodeStack.insert(0, my_node.right)    # 深度优先(先序遍历)

def preorder(self, start_node):

if start_node == None:            return

print(start_node.val)

self.preorder(start_node.left)

self.preorder(start_node.right)    # 深度优先(中序遍历)

def inorder(self, start_node):

if start_node == None:            return

self.inorder(start_node.left)

print(start_node.val)

self.inorder(start_node.right)    # 深度优先(后序遍历)

def outorder(self, start_node):

if start_node == None:            return

self.outorder(start_node.left)

self.outorder(start_node.right)

print(start_node.val)def main():

bt = BinaryTree()

bt.addNode(0)

bt.addNode(1)

bt.addNode(2)

bt.addNode(3)

bt.addNode(4)

bt.addNode(5)

bt.addNode(6)

bt.addNode(7)

bt.addNode(8)

bt.addNode(9)

print("广度遍历-->")

bt.breadthFirst()

print("先序遍历-->")

bt.preorder(bt.root)

print("中序遍历-->")

bt.inorder(bt.root)

print("后序遍历-->")

bt.outorder(bt.root)if __name__ == '__main__':

main()

深度优先搜索和广度优先搜索是图遍历的两种算法,它们在遍历顺序和实现方法上有所不同。 深度优先搜索(DFS)是沿着一条路径不断往下进行深度搜索。它选择最新成为候补的顶点,沿着新发现的路径不断深入搜索。在Python中,可以使用以下代码实现深度优先搜索: ```python def dfs(adj, start): visited = set() stack = [[start, 0]] while stack: (v, next_child_idx) = stack[-1] if (v not in adj) or (next_child_idx >= len(adj[v])): stack.pop() continue next_child = adj[v][next_child_idx] stack[-1][1 = 1 if next_child in visited: continue print(next_child) visited.add(next_child) stack.append([next_child, 0]) graph = {1: [4, 2], 2: [3, 4], 3: [4], 4: [5]} dfs(graph, 1) ``` 广度优先搜索(BFS)是从根节点开始,沿着树的宽度遍历树的节点。它选择最早成为候补的顶点,从离起点近的地方开始按顺序搜索。在Python中,可以使用以下代码实现广度优先搜索: ```python import queue def bfs(adj, start): visited = set() q = queue.Queue() q.put(start) while not q.empty(): u = q.get() print(u) for v in adj.get(u, []): if v not in visited: visited.add(v) q.put(v) graph = {1: [4, 2], 2: [3, 4], 3: [4], 4: [5]} bfs(graph, 1) ``` 这些代码可以让你在给定图的情况下,使用深度优先广度优先算法进行搜索并输出结果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Python广度优先深度优先](https://blog.csdn.net/m0_50481455/article/details/118695003)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [深度优先算法和广度优先算法(python)](https://blog.csdn.net/qq_41661056/article/details/95605803)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值