Python树的深度优先遍历广度优先遍历

博客介绍了树的广度优先(层次遍历)和深度优先遍历。广度优先从树的根节点开始,按从上到下、从左到右顺序遍历节点;深度优先有前序、中序、后序三种遍历算法,分别说明了三种算法的访问顺序。

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

广度优先(层次遍历)

从树的root开始,从上到下从左到右遍历整个树的节点

数和二叉树的区别就是,二叉树只有左右两个节点

广度优先 顺序:A - B - C - D - E - F - G - H - I

代码实现

def breadth_travel(self, root):
        """利用队列实现树的层次遍历"""
        if root == None:
            return
        queue = []
        queue.append(root)
        while queue:
            node = queue.pop()
            print node.elem,
            if node.lchild != None:
                queue.append(node.lchild)
            if node.rchild != None:
                queue.append(node.rchild)

深度优先

深度优先有三种算法:前序遍历,中序遍历,后序遍历

image.png

  • 先序遍历 在先序遍历中,我们先访问根节点,然后递归使用先序遍历访问左子树,再递归使用先序遍历访问右子树
    根节点->左子树->右子树

      #实现 1
      def preorder(self, root):
            """递归实现先序遍历"""
            if root == None:
                return
            print root.elem
            self.preorder(root.lchild)
            self.preorder(root.rchild)
           
      #实现 2  
      def depth_tree(tree_node):
          if tree_node is not None:
              print (tree_node._data)
              if tree_node._left is not None:
                  return depth_tree(tree_node._left)
              if tree_node._right is not None:
                  return depth_tree(tree_node._right)
    
  • 中序遍历 在中序遍历中,我们递归使用中序遍历访问左子树,然后访问根节点,最后再递归使用中序遍历访问右子树
    左子树->根节点->右子树

def inorder(self, root):
      """递归实现中序遍历"""
      if root == None:
          return
      self.inorder(root.lchild)
      print root.elem
      self.inorder(root.rchild) 
  • 后序遍历 在后序遍历中,我们先递归使用后序遍历访问左子树和右子树,最后访问根节点
    左子树->右子树->根节点
def postorder(self, root):
      """递归实现后续遍历"""
      if root == None:
          return
      self.postorder(root.lchild)
      self.postorder(root.rchild)
      print root.elem


转载 原文链接:https://www.jianshu.com/p/ee4cf469f5c4

### Python 中深度优先遍历广度优先遍历 #### 深度优先遍历 (Depth First Search, DFS) 深度优先遍历是一种用于遍历或搜索图或树的算法。该方法会尽可能深地探索每一个分支,直到无法再深入为止,然后回溯并继续未完成的其他分支。 在Python中实现DFS可以采用递归方式或是利用栈的数据结构迭代处理。以下是基于递归的方法: ```python def dfs(graph, start, visited=None): if visited is None: visited = set() visited.add(start) print(start, end=' ') for next_node in graph[start] - visited: dfs(graph, next_node, visited) # 继续向下一层递归 return visited ``` 此代码片段展示了如何通过递归来执行深度优先遍历[^3]。 另一种非递归的方式则是借助显式的栈来进行节点访问控制: ```python from collections import deque def iterative_dfs(graph, start): stack, path = [start], [] while stack: vertex = stack.pop() # 移除最后一个元素作为当前顶点 if vertex not in path: path.append(vertex) # 将相邻但尚未被访问过的节点加入栈中 stack.extend(set(graph[vertex]) - set(path)) return path ``` 这段程序同样实现了深度优先遍历的功能,不过它是以循环的形式来代替之前的函数调用堆栈[^4]。 #### 广度优先遍历 (Breadth First Search, BFS) 相比之下,广度优先遍历则更倾向于逐层展开搜索范围,在每一层次内按照从左向右的方向依次考察各个子节点。因此,当面对具有分层特性的数据集时(比如二叉树),这种方法能够有效地找到离起始位置最近的目标对象。 下面是使用队列机制编写的一个简单的BFS版本: ```python from collections import deque def bfs(graph, root): visited, queue = [], deque([root]) while queue: node = queue.popleft() # 获取最先入队的那个元素 if node not in visited: visited.append(node) neighbors = set(graph[node]) # 把邻居们按顺序加进来准备后续处理 queue += list(neighbors - set(visited)) return visited ``` 上述例子说明了怎样运用先进先出的原则去管理待查访列表中的成员,并最终获得完整的遍历序列[^2]。 #### 区别 两者的主要差异在于它们对待新发现节点的态度不同:DFS倾向于立即探索单个方向上的全部可能性;而BFS会选择先把同级的所有候选者都记录下来之后再去逐一检验。这种策略上的差别使得各自适用于不同类型的任务场景之中——例如寻找连通组件、检测环路等问题更适合用DFS解决;而在计算最短路径方面,则往往推荐选用BFS方案[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值