在内卷潮流的席卷下,身为算法小白的我不得不问自己,是否得踏上征程,征服这座巍巍高山。
从零开始,终点不知何方,取决于自己可以坚持多久。
希望你可以和我一样,克服恐惧,哪怕毫无基础,哪怕天生愚钝,依然选择直面困难。
分类
- 递归
- 多叉树
前言
在之前的文章我们学习了二叉树的遍历,顺藤摸瓜我们继续学习下多叉树的遍历。
没有看过之前二叉树遍历文章的同学可以先看看二叉树的遍历实现
多叉树的遍历
在前面二叉树的基础上,多叉树的遍历对于我们来说应该是 a piece of cake
🍰。
同样的,我们将其分为
- 深度优先遍历
- 广度优先遍历
我们下面的算法以这棵树为🌰
其数据结构表示为
const root = { data: 'A', children: [ { data: 'B', children: [ { data: 'E' }, { data: 'F', children: [ { data: "I" } ] } ] }, { data: 'C' }, { data: 'D', children: [ { data: 'G', children: [ { data: 'J' }, { data: 'K' } ] }, { data: 'H' } ] } ] } 复制代码
深度优先遍历
深度优先遍历和二叉树遍历非常相似,我们同样将其分为
- 递归实现
- 非递归实现
我们将在代码中通过注释进行分析,就不另外分析了
递归实现
const deepFirstSearch = (node) => { const children = node.children; console.log(node.data) if (children) { // 遍历子节点递归 for (let i = 0, len = children.length; i < len; i++) { deepFirstSearch(children[i]) } } } 复制代码
非递归实现
const deepFirstSearch = (node) => { // 利用栈实现 const stack = [node] while(stack.length) { // 出栈 const curNode = stack.pop() console.log(curNode.data) // 遍历子节点压入栈中 const children = curNode.children if (children) { // 得注意这边的顺序是反向的 // 左边的节点后进栈才能先出栈 for (let len = children.length, i = len - 1; i >= 0; i--) { stack.push(children[i]) } } } } 复制代码
广度优先遍历
同样,广度优先遍历和二叉树遍历也非常相似,我们同样将其分为
- 递归实现
- 非递归实现
我们将在代码中通过注释进行分析,就不另外分析了
递归实现
const widthFirstSearch = (nodes) => { // 按层遍历的核心就是提前提取下次遍历的节点 const nextChildren = [] // 可以加个判断 这样就可以直接以根节点作为入参了 nodes = Array.isArray(nodes) ? nodes : [nodes] // 加判断结束递归 if (nodes.length === 0) return // 访问当前层次节点并提取下层节点 for (let i = 0, len = nodes.length; i < len; i++) { console.log(nodes[i].data) if (nodes[i].children) { nextChildren.push(...nodes[i].children) } } // 递归下层次 widthFirstSearch(nextChildren) } 复制代码
非递归实现
const widthFirstSearch2 = (node) => { // 按层次遍历的非递归使用队列实现 const list = [node] // 访问当前节点的同时往队列添加子节点以待下层遍历访问 for (let i = 0; i < list.length; i++) { const curNode = list[i] console.log(curNode.data) if (curNode.children) { list.push(...curNode.children) } } } 复制代码
总结
在前面两篇文章二叉树的递归遍历及非递归遍历的基础下,多叉树的遍历就非常简单了。甚至多叉树的非递归遍历会比二叉树来的简单,因为不需要关注不同顺序的深度优先遍历。树的学习我们就先学到这边啦,后面我们通过leetcode
的题来巩固知识。
good good staduy day day up