美文网首页
JavaScript 递归之 深度优先 和 广度优先

JavaScript 递归之 深度优先 和 广度优先

作者: Cherry丶小丸子 | 来源:发表于2023-08-11 15:38 被阅读0次

在前端工作当中,经常会遇到树组件、树形表格、机构树等功能,这个时候就需要对后端返回的数据进行处理,在对树形数据处理时,一般是需要用到递归来处理,而递归又分为了 深度优先广度优先,这里给出了两种递归方法的示例

image.png
1 数据准备
const tree = {
    id: 1,
    children: [
        {
            id: 2,
            children: [
                {
                    id: 4,
                    children: [
                        { id: 8 },
                        { id: 9 }
                    ]
                },
                { id: 5 }
            ]
        },
        {
            id: 3,
            children: [
                { id: 6 },
                { id: 7 }
            ]
        },
    ]
};
2 深度优先

顾名思义,深度优先的意思就是以深度为主。我们可以把树机构的分支看作为一个个路径,当进行深度优先的递归时,程序会在一条路径下,一直走下去,直到不能在走为止,然后换一个路径继续走到底,走的层级很深。

通过代码打印的 1, 2, 4, 8, 9 可以看到是把第一个分支里面走到了底

function recursion(list){
    list.forEach(item => {
        console.log(item.id);
        if(item.children){
            recursion(item.children);
        }
    });
}
recursion([tree]); // 调用函数,会依次打印:1, 2, 4, 8, 9, 5, 3, 6, 7
3 广度优先

前面说深度优先是一条道走到底,类似于遇见了岔道,一条岔道走到了底,直到无路可走,而广度优先则恰恰相反,广度优先是把每一个层级的所有选择都走一遍,只有当第一个层级走完之后,才会走第二个层级。

以上面的图为例,先走到1,然后1走完之后,遇见了2和3,广度优先时会先走一下2和3,走完之后,再处理4和5,顺序为1 > 2 > 3 > 4 > 5 > 6 > 7 > 8 > 9

// 方法一:
// 先遍历当前节点,forEach 当中找到当前项所有的子节点,放到同一个数组当中
// 也就是找到下一层级的全部节点
let tempArr = [];
function recursion(list){
    tempArr = [];
    list.forEach(item => {
        console.log(item.id);
        if(item.children){
            tempArr = tempArr.concat(item.children);
        }
    });
    tempArr.length > 0 && recursion(tempArr);
}
recursion([tree]); // 调用函数,会依次打印:1, 2, 3, 4, 5, 6, 7, 8, 9

// 方法二:使用队列的思想,先进先出,依次将节点加入到数组当中,再从前面弹出
function queueRecursion(){
    while (tempArr.length){
        let item = tempArr.shift(); // 弹出第一个
        console.log(item.id);
        if(item.children){
            tempArr = tempArr.concat(item.children); // 添加节点
        }
    }
}
let tempArr = [];
tempArr = [tree]; 
queueRecursion(); // 调用函数,会依次打印:1, 2, 3, 4, 5, 6, 7, 8, 9

原文地址:https://blog.csdn.net/qq_44212319/article/details/126212938

相关文章

  • 5. 深度优先、广度优先

    1. 二叉树的深度优先遍历和广度优先遍历2. 深度优先搜索递归和非递归实现 深度优先(DFS):前序遍历 广度优先...

  • 递归、迭代、回溯、广度和深度优先

    在学习算法的时候,经常碰到递归、迭代、回溯、广度优先和深度优先算法,可是回溯使用了递归,深度优先也使用了递归,广度...

  • js-树的遍历

    数据 广度优先遍历 深度优先遍历 深度优先不递归

  • 深度优先遍历和广度优先遍历

    以html节点为列进行深度优先和广度优先遍历 1. 深度优先遍历 递归 非递归,栈表示法 2. 广度优先遍历 队列表示法

  • Python深度优先与广度优先

    深度优先(递归实现) 广度优先(队列实现)

  • 前端面试考点之数据结构

    1、深度优先和广度优先的区别 1) 二叉树的深度优先遍历的非递归的通用做法是采用栈,广度优先遍历的非递归的通用做法...

  • 深度优先和广度优先 2020-06-15

    广度优先: 深度优先:递归当前节点(node)下面的子节点(node.children)

  • 图的相关算法

    深度优先搜索非递归形式 DFS 深度优先搜索非递归形式 广度优先搜索 BFS 判断无向图是否是树 判断有向图中两...

  • 多叉树的遍历Java实现

    图片来自链接遍历多叉树 实现方法 递归。 广度优先,需要借助队列。 深度优先,需要借助栈。 定义节点 递归 广度优...

  • 589-N叉树的前序遍历

    题目说了递归很简单..还是先来递归: 迭代法:广度优先搜索用队列,深度优先搜索用栈,这里是深度优先搜索,所以需要定...

网友评论

      本文标题:JavaScript 递归之 深度优先 和 广度优先

      本文链接:https://www.haomeiwen.com/subject/eaetmdtx.html