请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

老师,这里根本没有必要用Map来传递parentId

这是我的简单方案

  let curNode = linkNode.pop()
  curNode.parentId = 0

  while (curNode) {
    const { id, name, parentId } = curNode
    res.push({ id, name, parentId })
    for (const item of curNode.children) {
      item.parentId = curNode.id
      linkNode.add(item)
    }
    curNode = linkNode.pop()
  }

第一个元素,默认parentId = 0就可以,遍历children的时候,当前子节点的parentId等于父节点的id就可以了

老师,有时候一些算法和手写代码的题目,看你写的代码,不是那么好理解,在手写代码的课程上面,学习进度非常慢

正在回答 回答被采纳积分+3

2回答

宅到深处自然萌 2025-07-09 15:38:39

你这方法会改变原来的对象,我提供一个:

const convertTreeToArr = (root: ITreeNode): IArrayItem[] => {
  const result = []
  const queue = [{ node: root, parentId: 0 }]

  while(queue.length) {
    const { node, parentId } = queue.shift()
    const arrItem: IArrayItem = { id: node.id, name: node.name, parentId }
    result.push(arrItem)
    if (node.children) {
      node.children.forEach((child) => {
        queue.push({ node: child, parentId: node.id })
      })
    }
  }

  return result
}


0 回复 有任何疑惑可以回复我~
双越 2022-07-05 19:28:08

具体哪部分不好理解?

0 回复 有任何疑惑可以回复我~
  • 提问者 自胜者强123 #1
    有部分算法和手写代码不是那么好理解,有时候每个人的考虑场景不一样
    比如这个 数组转树
    function convert(arr: IArrayItem[]): ITreeNode | null {
        // 用于 id 和 treeNode 的映射
        const idToTreeNode: Map<number, ITreeNode> = new Map()
    
        let root = null
    
        arr.forEach(item => {
            const { id, name, parentId } = item
    
            // 定义 tree node 并加入 map
            const treeNode: ITreeNode = { id, name }
            idToTreeNode.set(id, treeNode)
    
            // 找到 parentNode 并加入到它的 children
            const parentNode = idToTreeNode.get(parentId)
            if (parentNode) {
                if (parentNode.children == null) parentNode.children = []
                parentNode.children.push(treeNode)
            }
    
            // 找到根节点
            if (parentId === 0) root = treeNode
        })
    
        return root
    }
    老师的实现方式,就没有考虑到parentId后出现的场景,比如数据结构是这样的,这段代码就会有bug
    const arr = [
       { id: 3, name: '部门C', parentId: 1 },
        { id: 2, name: '部门B', parentId: 1 },  
        { id: 1, name: '部门A', parentId: 0 }, // 0 代表顶级节点,无父节点
    ]
    
    整体课程质量还是相当可以,比较结构化
    不是说课程不好,只是说,部分题目的手写代码,不是那么好理解
    回复 有任何疑惑可以回复我~ 2022-07-05 20:11:52
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号