总结深度优先与广度优先的区别

article/2025/9/17 4:01:54
3

总结深度优先与广度优先的区别

1、区别

       1) 二叉树的深度优先遍历的非递归的通用做法是采用栈,广度优先遍历的非递归的通用做法是采用队列。

       2) 深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次。要特别注意的是,二叉树的深度优先遍历比较特殊,可以细分为先序遍历、中序遍历、后序遍历。具体说明如下:

  • 先序遍历:对任一子树,先访问根,然后遍历其左子树,最后遍历其右子树。
  • 中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树。
  • 后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。

        广度优先遍历:又叫层次遍历,从上往下对每一层依次访问,在每一层中,从左往右(也可以从右往左)访问结点,访问完一层就进入下一层,直到没有结点可以访问为止。   

     3)深度优先搜素算法:不全部保留结点,占用空间少;有回溯操作(即有入栈、出栈操作),运行速度慢。

          广度优先搜索算法:保留全部结点,占用空间大; 无回溯操作(即无入栈、出栈操作),运行速度快。

          通常 深度优先搜索法不全部保留结点,扩展完的结点从数据库中弹出删去,这样,一般在数据库中存储的结点数就是深度值,因此它占用空间较少。

所以,当搜索树的结点较多,用其它方法易产生内存溢出时,深度优先搜索不失为一种有效的求解方法。  

          广度优先搜索算法,一般需存储产生的所有结点,占用的存储空间要比深度优先搜索大得多,因此,程序设计中,必须考虑溢出和节省内存空间的问题。

但广度优先搜索法一般无回溯操作,即入栈和出栈的操作,所以运行速度比深度优先搜索要快些

2.二叉树的遍历

先序遍历(递归):35 20 15 16 29 28 30 40 50 45 55 
中序遍历(递归):15 16 20 28 29 30 35 40 45 50 55 
后序遍历(递归):16 15 28 30 29 20 45 55 50 40 35 
先序遍历(非递归):35 20 15 16 29 28 30 40 50 45 55 
中序遍历(非递归):15 16 20 28 29 30 35 40 45 50 55 
后序遍历(非递归):16 15 28 30 29 20 45 55 50 40 35 
广度优先遍历:35 20 40 15 29 50 16 28 30 45 55

代码:

复制代码
package BinaryTreeTraverseTest;  import java.util.LinkedList;  
import java.util.Queue;  /** * 二叉树的深度优先遍历和广度优先遍历 * @author Fantasy * @version 1.0 2016/10/05 - 2016/10/07 */  
public class BinaryTreeTraverseTest {  public static void main(String[] args) {  BinarySortTree<Integer> tree = new BinarySortTree<Integer>();  tree.insertNode(35);  tree.insertNode(20);  tree.insertNode(15);  tree.insertNode(16);  tree.insertNode(29);  tree.insertNode(28);  tree.insertNode(30);  tree.insertNode(40);  tree.insertNode(50);  tree.insertNode(45);  tree.insertNode(55);  System.out.print("先序遍历(递归):");  tree.preOrderTraverse(tree.getRoot());  System.out.println();  System.out.print("中序遍历(递归):");  tree.inOrderTraverse(tree.getRoot());  System.out.println();  System.out.print("后序遍历(递归):");  tree.postOrderTraverse(tree.getRoot());  System.out.println();  System.out.print("先序遍历(非递归):");  tree.preOrderTraverseNoRecursion(tree.getRoot());  System.out.println();  System.out.print("中序遍历(非递归):");  tree.inOrderTraverseNoRecursion(tree.getRoot());  System.out.println();  System.out.print("后序遍历(非递归):");  tree.postOrderTraverseNoRecursion(tree.getRoot());  System.out.println();  System.out.print("广度优先遍历:");  tree.breadthFirstTraverse(tree.getRoot());  }  
}  /** * 结点 */  
class Node<E extends Comparable<E>> {  E value;  Node<E> left;  Node<E> right;  Node(E value) {  this.value = value;  left = null;  right = null;  }  }  /** * 使用一个先序序列构建一棵二叉排序树(又称二叉查找树) */  
class BinarySortTree<E extends Comparable<E>> {  private Node<E> root;  BinarySortTree() {  root = null;  }  public void insertNode(E value) {     if (root == null) {  root = new Node<E>(value);  return;  }      Node<E> currentNode = root;  while (true) {  if (value.compareTo(currentNode.value) > 0) {  if (currentNode.right == null) {  currentNode.right = new Node<E>(value);  break;  }  currentNode = currentNode.right;  } else {  if (currentNode.left == null) {  currentNode.left = new Node<E>(value);  break;  }  currentNode = currentNode.left;  }  }  }  public Node<E> getRoot(){  return root;  }  /** * 先序遍历二叉树(递归) * @param node */  public void preOrderTraverse(Node<E> node) {  System.out.print(node.value + " ");  if (node.left != null)  preOrderTraverse(node.left);  if (node.right != null)  preOrderTraverse(node.right);  }  /** * 中序遍历二叉树(递归) * @param node */  public void inOrderTraverse(Node<E> node) {  if (node.left != null)  inOrderTraverse(node.left);  System.out.print(node.value + " ");  if (node.right != null)  inOrderTraverse(node.right);  }  /** * 后序遍历二叉树(递归) * @param node */  public void postOrderTraverse(Node<E> node) {  if (node.left != null)  postOrderTraverse(node.left);  if (node.right != null)  postOrderTraverse(node.right);  System.out.print(node.value + " ");  }  /** * 先序遍历二叉树(非递归) * @param root */  public void preOrderTraverseNoRecursion(Node<E> root) {  LinkedList<Node<E>> stack = new LinkedList<Node<E>>();  Node<E> currentNode = null;  stack.push(root);  while (!stack.isEmpty()) {  currentNode = stack.pop();  System.out.print(currentNode.value + " ");  if (currentNode.right != null)  stack.push(currentNode.right);  if (currentNode.left != null)  stack.push(currentNode.left);  }  }  /** * 中序遍历二叉树(非递归) * @param root */  public void inOrderTraverseNoRecursion(Node<E> root) {  LinkedList<Node<E>> stack = new LinkedList<Node<E>>();  Node<E> currentNode = root;  while (currentNode != null || !stack.isEmpty()) {  // 一直循环到二叉排序树最左端的叶子结点(currentNode是null)  while (currentNode != null) {  stack.push(currentNode);  currentNode = currentNode.left;  }  currentNode = stack.pop();  System.out.print(currentNode.value + " ");  currentNode = currentNode.right;  }     }  /** * 后序遍历二叉树(非递归) * @param root */  public void postOrderTraverseNoRecursion(Node<E> root) {  LinkedList<Node<E>> stack = new LinkedList<Node<E>>();  Node<E> currentNode = root;  Node<E> rightNode = null;  while (currentNode != null || !stack.isEmpty()) {  // 一直循环到二叉排序树最左端的叶子结点(currentNode是null)  while (currentNode != null) {  stack.push(currentNode);  currentNode = currentNode.left;  }  currentNode = stack.pop();  // 当前结点没有右结点或上一个结点(已经输出的结点)是当前结点的右结点,则输出当前结点  while (currentNode.right == null || currentNode.right == rightNode) {  System.out.print(currentNode.value + " ");  rightNode = currentNode;  if (stack.isEmpty()) {  return; //root以输出,则遍历结束  
                }  currentNode = stack.pop();  }  stack.push(currentNode); //还有右结点没有遍历  currentNode = currentNode.right;  }  }  /** * 广度优先遍历二叉树,又称层次遍历二叉树 * @param node */  public void breadthFirstTraverse(Node<E> root) {  Queue<Node<E>> queue = new LinkedList<Node<E>>();  Node<E> currentNode = null;  queue.offer(root);  while (!queue.isEmpty()) {  currentNode = queue.poll();  System.out.print(currentNode.value + " ");  if (currentNode.left != null)  queue.offer(currentNode.left);  if (currentNode.right != null)  queue.offer(currentNode.right);  }  }  }  
复制代码

3.图

 图的遍历之 深度优先搜索和广度优先搜索


http://chatgpt.dhexx.cn/article/MVP2gPpE.shtml

相关文章

连通图里的深度优先和广度优先遍历

从图中的某个顶点出发&#xff0c;按照某种搜索方法沿着图的边访问图中的所有顶点&#xff0c;使得每个顶点仅被访问一次&#xff0c;这个过程称为图的遍历。图的遍历有两种&#xff1a;深度优先遍历和广度优先遍历。   图分为连通图和非连通图&#xff0c;这里主要讨论连通图…

广度优先算法

广度优先算法 本文主要以介绍算法思想为主这里并没有进行源码实现&#xff0c;但是给出推荐使用的数据结构和主要思想。 首先介绍一下广度优先算法&#xff0c;假设要查找AB两点之间的最短距离&#xff0c;以A为起点B为终点。可以先遍历A的相邻节点&#xff0c;这些节点称之为…

C语言基于邻接表的图的深度优先、广度优先遍历

目录 1 深度优先&#xff08;Depth_First Search&#xff09; 2 广度优先&#xff08;Broadth_First Search&#xff09; 3 基于邻接表的深度优先、广度优先遍历 4 源代码示例 4.1 深度优先 4.2广度优先 假设有无向图G &#xff08;V&#xff0c;E&#xff09;&#xff…

数据结构之深度优先和广度优先遍历

文章目录 图为什么要有图图的常用概念邻接矩阵邻接表图的深度优先遍历深度优先遍历基本思想深度优先遍历算法步骤深度优先算法的代码实现 图的广度优先遍历广度优先遍历基本思想广度优先遍历算法步骤广度优先算法的代码实现图结构完整代码 图 为什么要有图 1)前面我们学了线性…

图的深度优先和广度优先遍历算法

编写一个程序&#xff0c;输出下面带权有向图的邻接表&#xff0c;并根据该邻接表&#xff0c;实现图的遍历运算&#xff0c;具体要求如下&#xff1a; (1)从顶点0开始的深度优先遍历序列(递归算法) (2)从顶点0开始的深度优先遍历序列(非递归算法) (3)从顶点0开始的广度优先遍历…

算法之深度优先、广度优先算法

目录 前言&#xff1a; 搜索算法&#xff1a; 广度优先搜索算法 深度优先搜索算法 问题&#xff1a;如何找出社交网络中某个用户的三度好友关系&#xff1f; 总结&#xff1a; 参考资料&#xff1a; 前言&#xff1a; 图这种数据结构经常用于表示一个社交网络&#x…

广度优先搜索与深度优先搜索

广度优先搜索&#xff08;宽度优先搜索&#xff0c;BFS&#xff09;和深度优先搜索&#xff08;DFS&#xff09;算法的应用非常广泛&#xff0c;本篇文章主要介绍BFS与DFS的原理、实现和应用。 深度优先搜索 图的深度优先搜索(Depth First Search)&#xff0c;和树的先序遍历…

深度优先遍历与广度优先遍历

1、深度优先遍历(Depth First Search, 简称 DFS) 1.1、主要思路 从图中一个未访问的顶点 V 开始&#xff0c;沿着一条路一直走到底&#xff0c;然后从这条路尽头的节点回退到上一个节点&#xff0c;再从另一条路开始走到底…&#xff0c;不断递归重复此过程&#xff0c;直到所…

深度优先与广度优先

深度优先遍历简称DFS&#xff08;Depth First Search&#xff09;&#xff0c;广度优先遍历简称BFS&#xff08;Breadth First Search&#xff09;&#xff0c;它们是遍历图当中所有顶点的两种方式。 深度优先遍历&#xff1a; 选取一个节点开始&#xff0c;沿着一条路一直走…

深度优先遍历(DFS)和广度优先遍历(BFS)

深度优先遍历&#xff08;DFS&#xff09;和广度优先遍历&#xff08;BFS&#xff09; 图的遍历&#xff1a;所谓遍历&#xff0c;即是对结点的访问。一个图有多个结点&#xff0c;如何遍历这些结点&#xff0c;有两种访问策略&#xff1a; 深度优先遍历(Depth First Search, …

深度优先与广度优先的区别!

从深度优先和广度优先两个角度解决同一个问题 题目 从一号顶点开始遍历这个图&#xff0c;使用深度优先搜索和广度优先搜索的2种遍历结果 深度优先遍历的主要思想就是&#xff0c;首先以一个未被访问过的顶点作为起始顶点&#xff0c;沿着当前顶点的边走到未访问过的顶点&…

数据结构:图的遍历--深度优先、广度优先

图的遍历&#xff1a;深度优先、广度优先 遍历 图的遍历是指从图中的某一顶点出发&#xff0c;按照一定的策略访问图中的每一个顶点。当然&#xff0c;每个顶点有且只能被访问一次。 在图的遍历中&#xff0c;深度优先和广度优先是最常使用的两种遍历方式。这两种遍历方式对无…

深度优先搜索与广度优先搜索

算法是作用于具体数据结构之上的&#xff0c;深度优先搜索算法和广度优先搜索算法都是基于“图”这种数据结构的。这是因为&#xff0c;图这种数据结构的表达能力很强&#xff0c;大部分涉及搜索的场景都可以抽象成“图”。 图上的搜索算法&#xff0c;最直接的理解就是&#…

广度优先搜索和深度优先搜索

文章目录 1. 前言2. 广度优先搜索和深度优先搜索1&#xff09;深度优先搜索2&#xff09;广度优先搜索 3. 深度优先搜索算法框架1&#xff09;二叉树深度优先搜索模板2&#xff09;图深度优先搜索模板3&#xff09;二维矩阵深度优先搜索模板 4. 广度优先搜索算法框架1&#xff…

深度优先和广度优先算法

1、深度优先算法 遍历规则&#xff1a;不断地沿着顶点的深度方向遍历。顶点的深度方向是指它的邻接点方向。 最后得出的结果为&#xff1a;ABDECFHG。 Python代码实现的伪代码如下&#xff1a; 2、广度优先算法&#xff1a; 遍历规则&#xff1a; 1&#xff09;先访问完当…

深度优先搜索(DFS)和广度优先搜索(BFS)

代码随想录 深度优先搜索和广度优先搜索&#xff0c;都是图形搜索算法&#xff0c;它两相似&#xff0c;又却不同&#xff0c;在应用上也被用到不同的地方。这里拿一起讨论&#xff0c;方便比较。 先给大家说一下两者大概的区别&#xff1a; 如果搜索是以接近起始状态的程序依次…

算法:深度优先和广度优先(DFS,BFS)

一丶深度优先&#xff08;DFS&#xff09; 深度优先顾名思义: 就是往深的地方优先查找或遍历。 如图二叉树&#xff0c;想遍历树中所有结点可以用中序遍历&#xff0c;前序或后序。如果某一结点还有子结点就会往深处就是往下一结点&#xff0c;一直遍历直到最后一个结点没有子…

【算法】深度优先和广度优先

本文只是总结的相关概念&#xff0c;仅供自己复习&#xff0c;严禁转载&#xff0c;文末附有本文内容涉及的文章链接&#xff0c;请点开链接查看原文&#xff01; &#xff08;一&#xff09;深度优先 深度优先搜索属于图算法的一种&#xff0c;是一个针对图和树的遍历算法&am…

算法:深度优先遍历和广度优先遍历

什么是深度、广度优先遍历 图的遍历是指&#xff0c;从给定图中任意指定的顶点&#xff08;称为初始点&#xff09;出发&#xff0c;按照某种搜索方法沿着图的边访问图中的所有顶点&#xff0c;使每个顶点仅被访问一次&#xff0c;这个过程称为图的遍历。遍历过程中得到的顶点…

ms17010利用失败解决一则

没有反弹得到session并且提示如下&#xff1a; [-] 10.0.131.2:445 - Service failed to start, ERROR_CODE: 216 换了一个payload set payload windows/meterpreter/reverse_tcp set payload windows/x64/meterpreter/bind_tcp 就可以了。 如果遇到Unable to continue with i…