前端高频面试题系列之第1题

102 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情

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

面试题:

给定一个二叉树,使用 DFS 和 BFS 遍历返回所有节点。

<div id="parent">
        <div class="children1">
            <div class="children1-1">
                <div class="children1-1-1">
                    a
                </div>
            </div>
            <div class="children1-2">
                <div class="children1-2-1">
                    b
                </div>
            </div>
            <div class="children1-3">
                c
            </div>
        </div>
        <div class="children2">
            <div class="children2-1">
                <div class="children2-1-1">
                    d
                </div>
            </div>
            <div class="children2-2">
                <div class="children2-2-1">
                    e
                </div>
            </div>
            <div class="children2-3">
                f
            </div>
        </div>
        <div class="children3">
            <div class="children3-1">
                <div class="children3-1-1">
                    g
                </div>
            </div>
            <div class="children3-2">
                <div class="children3-2-1">
                    h
                </div>
            </div>
            <div class="children3-3">
                r
            </div>
        </div>
    </div>

深度优先遍历(DFS)

DFS

  • DFS 的思想是从上至下,对每一个分支一直往下一层遍历直到这个分支结束,然后返回上一层,对上一层的右子树这个分支继续深搜,直到一整棵树完全遍历,因此符合栈后进先出的特点
  • 深度优先遍历常用的数据结构是
  • DFS 特性 : 不全部保留结点,占用空间少;有回溯操作(即有入栈、出栈操作),运行速度慢。
// 需要全部资料可以加我vx:15910703937  视频B站搜【前端铁蛋儿】
 // DFS 深度优先遍历 栈
let node_prent = document.querySelector('#parent')
     let dfc = (node) => {
         let stack = [] // 栈
         let nodes = [] // 存所有节点
         if (node) {
             stack.push(node) // 假如有节点就存到栈中
             while (stack.length) {
                 let item = stack.pop() // 出栈
                 nodes.push(item)
                 let children = item.children // 拿到子节点
                 // 每层从右往左取 取到放进stack
                 for (let i = children.length - 1; i >= 0; i--) {
                     stack.push(children[i])
                 }
             }
         }

         return nodes // 所有节点返回

     }
console.log(dfc(node_prent))

广度优先遍历(BFS)

BFS

  • BFS 的思想是从左至右,对树的每一层所有结点依次遍历,当一层的结点遍历完全后,对下一层开始遍历,而下一层结点又恰好是上一层的子结点。因此符合队列先进先出的特点
  • 深度优先遍历常用的数据结构为队列
  • BFS 的特性 : 保留全部结点,占用空间大;无回溯操作(即无入栈、出栈操作),运行速度快。
// 广度优先遍历  队列
let bfs = (node) => {
 let stack = [] // 队列
 let nodes = [] // 返回的节点
 if (node) {
     stack.push(node)
     while (stack.length) {
         let item = stack.shift() // 从前面去
         nodes.push(item)
         let children = item.children
         for (let i = 0; i < children.length; i++) {
             stack.push(children[i])
         }
     }
 }
 return nodes
}
console.log(bfs(node_prent))

本文视频对应 前端大厂高频面试题, 除此之外,如果你对技术有像一素的偏执,欢迎加我vx:15910703837一起学习一起进步。