前端面试100问(5)

news/2024/7/19 14:08:22 标签: dfs, 面试, 前端, js

码字不易,有帮助的同学希望能关注一下我的微信公众号:Code程序人生,感谢!代码自用自取。

题目:
介绍下深度优先遍历和广度优先遍历,如何实现?

第五题问的是深度优先遍历和广度优先遍历,我是从dom节点的遍历来理解这个问题的

深度优先遍历

深度优先遍历DFS 与树的先序遍历比较类似。
假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。

/*深度优先遍历三种方式*/
let deepTraversal1 = (node, nodeList = []) => {
  if (node !== null) {
    nodeList.push(node)
    let children = node.children
    for (let i = 0; i < children.length; i++) {
      deepTraversal1(children[i], nodeList)
    }
  }
  return nodeList
}
let deepTraversal2 = (node) => {
    let nodes = []
    if (node !== null) {
      nodes.push(node)
      let children = node.children
      for (let i = 0; i < children.length; i++) {
        nodes = nodes.concat(deepTraversal2(children[i]))
      }
    }
    return nodes
  }
// 非递归
let deepTraversal3 = (node) => {
  let stack = []
  let nodes = []
  if (node) {
    // 推入当前处理的node
    stack.push(node)
    while (stack.length) {
      let item = stack.pop()
      let children = item.children
      nodes.push(item)
      // node = [] stack = [parent]
      // node = [parent] stack = [child3,child2,child1]
      // node = [parent, child1] stack = [child3,child2,child1-2,child1-1]
      // node = [parent, child1-1] stack = [child3,child2,child1-2]
      for (let i = children.length - 1; i >= 0; i--) {
        stack.push(children[i])
      }
    }
  }
  return nodes
}

广度优先遍历

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

let widthTraversal2 = (node) => {
  let nodes = []
  let stack = []
  if (node) {
    stack.push(node)
    while (stack.length) {
      let item = stack.shift()
      let children = item.children
      nodes.push(item)
        // 队列,先进先出
        // nodes = [] stack = [parent]
        // nodes = [parent] stack = [child1,child2,child3]
        // nodes = [parent, child1] stack = [child2,child3,child1-1,child1-2]
        // nodes = [parent,child1,child2]
      for (let i = 0; i < children.length; i++) {
        stack.push(children[i])
      }
    }
  }
  return nodes
}

更多关于前端面试题内容关注我的公众号Code程序人生


有微信小程序课设、毕设需求联系个人QQ:505417246

关注下面微信公众号,可以领取微信小程序、Vue、TypeScript、前端、uni-app、全栈、Nodejs、Python等实战学习资料
最新最全的前端知识总结和项目源码都会第一时间发布到微信公众号,请大家多多关注,谢谢

在这里插入图片描述


http://www.niftyadmin.cn/n/1576541.html

相关文章

vi下对齐代码的操作

时不时会用到,但easy忘,在这里记录一下 1. ctrl v (选中块) 2. ctrl f (向前) 或 ctrl v (向后) 3. 按"", 把选中的代码对齐 转载于:https://www.cnblogs.com/gavanwanggw/p/6814220.html

基于微信小程序云开发的校园类平台

这期给大家介绍一个我压箱底的项目&#xff0c;一个集二手市场、兼职发布、失物招领、代取快递等功能为一身的校园类平台。 前端使用ColorUI&#xff0c;后端使用微信小程序云开发。 现在已经上线发布&#xff0c;并且长期运营维护。 大家可以直接在微信小程序中搜索校园海滨&…

android Notification 的使用(锁定通知栏)

近期一直在研究 android 。并一边研究一边做应用。当中遇到了把程序通知常驻在 Notification 栏&#xff0c;而且不能被 clear 掉&#xff08;就像android QQ一样&#xff09;的问题。经过研究实现了其功能。现把 Notification 的使用总结例如以下&#xff1a; Notification 的…

TypeScript 高级用法

码字不易&#xff0c;有帮助的同学希望能关注一下我的微信公众号&#xff1a;Code程序人生&#xff0c;感谢&#xff01;代码自用自取。 本文主要介绍 TypeScript 的高级用法&#xff0c;适用于对 TypeScript 已经有所了解或者已经实际用过一段时间的同学&#xff0c;分别从类型…

树莓派系统安装和调试 总结整理篇

第一次拿到树莓派的时候&#xff0c;觉得它好小&#xff0c;就像一个小电路板一样&#xff0c;经过对它的一番研究&#xff0c;感觉其实这个小电脑性能还是可以的&#xff0c;拿来运行一些小的程序、应用还是可以的&#xff0c;而且在有些情况下体积小就是它的优势。闲话不多说…

二叉树的应用(1)--二叉树排序树基本操作

#include <cstdio>struct BSTNode {int m_nval; //数据域BSTNode *m_pleft; // 左孩子节点BSTNode *m_pright; //右孩子节点 }; /************************************************************************ 功能&#xff1a;在二叉排序树中 查找key值。假设找到&…

原生JavaScript进阶训练---重写forEach方法

码字不易&#xff0c;有帮助的同学希望能关注一下我的微信公众号&#xff1a;Code程序人生&#xff0c;感谢&#xff01;代码自用自取。 从今天开始我们进行JavaScript基础内容的进阶训练&#xff0c;重写JavaScript内置方法。 forEach是ES6的一个重要方法&#xff0c;循环遍历…

ActiveMQ(16):Message Dispatch的分发策略、消息批量确认和生产者流量控制

一、分发策略&#xff08;Dispatch Policies&#xff09;1.1 严格顺序分发策略&#xff08;Strict Order Dispatch Policy&#xff09;通常ActiveMQ会保证topic consumer以相同的顺序接收来自同一个producer的消息&#xff0c;但有时候也需要保证不同的topic consumer以相同的顺…