二叉树的深度优先搜索和广度优先搜索 python

本文深入探讨了二叉树的两种主要搜索算法:深度优先搜索(DFS)和广度优先搜索(BFS)。详细解释了DFS使用栈实现的原理,以及BFS利用队列进行遍历的过程。通过Python代码示例,清晰展示了两种搜索方式的具体操作步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述

深度优先搜索,先遍历左子树,再遍历右子树
广度优先搜索,相当于直接横向打印二叉树

深度优先搜索使用栈,先进后出

将根节点append进栈,将根节点弹出,先进入右子节点,再进入左子节点

import collections
stack = []
stack.append(root)
while stack:
    node = stack.pop()
    if node.right is not None:
        stack.append(node.right)
    if node.left is not None:
        stack.append(node.left)
    print(node.val)

广度优先搜索使用队列,先进先出

将根节点先append进入队列,然后将根节点弹出,先append进左子节点,再append右子节点

import collections
deque = collections.deque()
deque.append(root)
while deque:
    node = deque.popleft()
    if node.left is not None:
        deque.append(node.left)
    if node.right is not None:
        deque.append(node.right)
    print(node.val)
### 二叉树广度优先搜索(BFS)深度优先搜索(DFS)区别及实现 #### 区别 广度优先搜索(BFS)深度优先搜索(DFS)是两种常见的二叉树遍历方法,它们的主要区别在于访问节点的顺序不同。 - **广度优先搜索(BFS)** BFS按照层次顺序访问二叉树中的节点,即先访问根节点,然后逐层访问其子节点。这种搜索方式适合于寻找最短路径或者解决需要按层级处理的问题[^2]。为了实现BFS,通常会使用队列作为辅助数据结构来存储待访问的节点。 - **深度优先搜索(DFS)** DFS则从根节点出发,尽可能深地沿某条路径访问节点,直到到达叶节点后再回溯至上一层节点并继续探索其他分支。DFS可以进一步分为三种具体形式:前序遍历、中序遍历后序遍历[^3]。这些不同的遍历方式适用于各种特定场景下的需求分析或计算操作。 #### 实现 以下是基于Python语言分别针对这两种算法的具体代码示例: ##### 广度优先搜索 (BFS) ```python from collections import deque class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def bfs(root): result = [] if not root: return result queue = deque([root]) while queue: node = queue.popleft() result.append(node.val) if node.left: queue.append(node.left) if node.right: queue.append(node.right) return result ``` 上述函数通过维护一个双端队列`queue`来进行迭代式的层次遍历过程[^5]。 ##### 深度优先搜索 (DFS) 这里展示一种典型的递归版本的DFS实现——前序遍历为例: ```python def dfs_preorder(root, result=[]): if not root: return result.append(root.val) # 访问当前结点 dfs_preorder(root.left, result) # 遍历左子树 dfs_preorder(root.right, result) # 遍历右子树 return result ``` 此段代码展示了如何利用递归来完成对整个二叉树自顶向下的深入探测,并记录下沿途遇到的所有节点值序列[^1]。 另外还有非递归版的栈模拟方法可用于某些特殊情况下替代传统递归调用以节省内存空间消耗等问题,在实际应用当中可以根据具体情况灵活选用合适的方式去解决问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值