请稍等 ...
×

采纳答案成功!

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

老师,这里根本没有必要用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

1回答

双越 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下载
官方微信