算法 DFS与BFS

傷城~ 2022-12-20 03:27 253阅读 0赞
一、DFS(深度优先搜索)

DFS: 深度优先遍历DFS与树的先序遍历比较类似。假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点然后依次访问它的所有邻接结点,每次访问一个邻接结点时,以该邻接结点为根结点继续进行DFS,直到结点的所有邻接结点以及其邻接结点的邻接结点都被访问完,才访问下一个邻接结点并进行同样操作,直至图中所有和v有路径相通的顶点都被访问到。若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。

二、BFS(广度优先搜索)

BFS: 从图中某顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使得“先被访问的顶点的邻接点先于后被访问的顶点的邻接点被访问,直至图中所有已被访问的顶点的邻接点都被访问到。 如果此时图中尚有顶点未被访问,则需要另选一个未曾被访问过的顶点作为新的起始点,重复上述过程,直至图中所有顶点都被访问到为止。

三、实现
  1. 实现以树为例:树是只有一个根节点,且没有回路的图
  2. 对图进行访问时要注意进行回路检测
  1. function TreeNode(_val=undefined, _left=null, _right=null){
  2. this.val = _val;
  3. this.left = _left;
  4. this.right = _right;
  5. }
  6. // 0
  7. // / \
  8. // 1 2
  9. // / \ / \
  10. // 3 4 5 6
  11. let root = new TreeNode(0);
  12. root.left = new TreeNode(1, new TreeNode(3), new TreeNode(4));
  13. root.right = new TreeNode(2, new TreeNode(5), new TreeNode(6));
  14. // DFS
  15. function dfs1(_root){
  16. // 递归法 前序遍历
  17. if(_root){
  18. console.log(_root.val);
  19. dfs1(_root.left);
  20. dfs1(_root.right);
  21. }
  22. }
  23. function dfs2(_root){
  24. if(!_root) return;
  25. // 非递归法 栈
  26. let stack = [_root];
  27. while (stack.length > 0){
  28. let item = stack.pop();
  29. console.log(item.val);
  30. // 从末尾开始压栈,二叉树就是先压right,再压left
  31. item.right && stack.push(item.right);
  32. item.left && stack.push(item.left);
  33. }
  34. }
  35. // BFS
  36. function bfs1(_root){
  37. if(!_root) return;
  38. // 队列
  39. let queue = [_root];
  40. while(queue.length > 0){
  41. let item = queue.shift();
  42. console.log(item.val);
  43. item.left && queue.push(item.left);
  44. item.right && queue.push(item.right);
  45. }
  46. }

发表评论

表情:
评论列表 (有 0 条评论,253人围观)

还没有评论,来说两句吧...

相关阅读

    相关 DFS&BFS

    图的基本介绍 前面我们学了线性表和树 线性表局限于一个直接前驱和一个直接后继的关系 树也只能有一个直接前驱也就是父节点 当我们需要表示多对多的关系时, 这里我们就用

    相关 算法 DFSBFS

    一、DFS(深度优先搜索) > DFS: 深度优先遍历DFS与树的先序遍历比较类似。假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点然后依次访问它

    相关 【经典算法】:BFSDFS

    写在最前的三点: 1、所谓图的遍历就是按照某种次序访问图的每一顶点一次仅且一次。 2、实现bfs和dfs都需要解决的一个问题就是如何存储图。一般有两种方法:邻接矩阵和邻接表