当前位置: 首页 > news >正文

树相关处理

树的结构

每层都有val和children

let tree = {val: 1,children: [{val: 2,children: [{val: 4, children:[]},{val: 5, children: []}]},{val: 3,children: [{val: 6, children:[]},{val: 7, children:[]},]}]}

树的遍历

  • 深度优先遍历(递归)
    const fun = (root) => {console.log(root.val)root.forEach(fun)}
  • 广度优先遍历(数组模拟队列的使用,右进左出)
1、新建队列,根节点入队
2、把对头出队
3、把对头的children挨个入队
4、重复2、3步,直到队列为空为止
const fun = (root) => {let arr = [root]while(arr.length){const o = arr.shift()o.children.forEach(item => {console.log(o.val)arr.push(item)})}}

将数组转化成树

前提:每项中有id和pId,且有对应关系,根节点项id为null

const bidsList = [{parent: null, id: 1, text: '111'},{parent: null, id: 2, text: '222'},{parent: 1, id: 3, text: '1-1'},{parent: 1, id: 4, text: '1-2'},{parent: 2, id: 4, text: '2-1'},
]
function getTreeList (rootList, id, list) {for (let item of rootList) {if (item.parent === id ) {list.push(item)}}for (let i of list) {const flagItem = bidsList.find(si => {return si.parentId === i.id})if(flagItem) {i.children = []getTreeList(rootList, i.id, i.children)}}return list
}const treeData = getTreeList(bidsList, null, [])
console.log('treeData', treeData)

二叉树的结构

let binaryTree = {val: 1,left: {val: 2,left: {val: 4, left: null, right: null},right: {val: 5, left: null, right: null}},right: {val: 3,left: {val: 6, left: null, right: null},right: {val: 7, left: null, right: null}}}

二叉树的遍历

  • 前序遍历(根左右1、2、4、5、3、6、7)
// 递归方式实现
let arr = []const fun = (node) => {if(node){arr.push(node.val)fun(node.left)fun(node.right)}}fun(binaryTree) console.log(arr)
//栈加循环方式实现
if(!root){return []}let arr = []let stack = [root]while(stack.length){let o = stack.pop()arr.push(o.val)o.right && arr.push(o.right)o.left && arr.push(o.left)}console.log(arr)
  • 中序遍历(左根右4、2、5、1、6、3、7)
// 递归实现
let arr = []
const fn = (tree) => {if(!tree){return}fn(tree.left)arr.push(tree.val)fn(tree.right)
}
fn(binaryTree)
console.log(arr)// 栈加循环实现
let arr = []
let stack = []
let o = binaryTree
while(stack.length || o){while(o){stack.push(o)o = o.left}const n = stack.pop()arr.push(n.val)o = n.right
}
console.log(arr)
  • 后序遍历(左右根4、5、2、6、7、3、1)
// 递归实现
let arr = []const fn = (node) => {if(node) {fn(node.left)fn(node.right)arr.push(node.val)}}fn(binaryTree)console.log(arr)// 栈加循环实现
let arr = []let stack = []while(stack.length){const o = stack.pop()arr.unshift(o)o.left && stack.push(o.left)o.right && stack.push(o.right)}console.log(arr)
http://www.xdnf.cn/news/165925.html

相关文章:

  • UniApp 的现状与 WASM 支持的迫切性
  • w308汽车销售系统的设计与实现
  • 腾讯CSIG一面
  • 05--Altium Designer(AD)的详细安装
  • SM30 权限检查
  • 高中数学联赛模拟试题精选第18套几何题
  • GPU加速-系统CUDA12.5-Windows10
  • cron定时任务
  • Linux | Mfgtools 修改单独只烧写 Uboot,内核,文件系统
  • 前端面试宝典---vue实现简化版
  • PCL点云处理之基于SAC-IA和ICP的点云配准完整流程(二百四十七)
  • 2025.04.26-美团春招笔试题-第一题
  • java中的Selector详解
  • Qt开发:QSettings的介绍和使用
  • JDK环境变量
  • 备忘录模式 (Memento Pattern)
  • Java 自定义TCP协议:【特点编码字符串<=>字节<=>特点编码16进制】16进制字符串和编码的转换 (各种编码通过字节向16进制的互转)| XOR计算
  • dubbo 异步化实践
  • 【MFA】✈️集成谷歌TOTP实现MFA多因素认证
  • 数组的多种声明方式:类型标注与泛型数组
  • 做大模型应用所需的一点点基础数学理论
  • 扩展和自定义 asammdf 库:满足特定需求的解决方案
  • 文章记单词 | 第46篇(六级)
  • 深度学习中的预训练与微调:从基础概念到实战应用全解析
  • Threejs中顶视图截图
  • javase和java有什么区别
  • spring响应式编程系列:异步生产数据
  • 第八课四则运算 设计运算器
  • 三维重建(二十)——思路整理与第一步的进行
  • 2025上海车展| 和芯星通发布覆盖车载全场景的产品方案