偏平数据结构转Tree

  1. let arr = [
  2. {id: 1, name: '部门1', pid: 0},
  3. {id: 2, name: '部门2', pid: 1},
  4. {id: 3, name: '部门3', pid: 1},
  5. {id: 4, name: '部门4', pid: 3},
  6. {id: 5, name: '部门5', pid: 4},
  7. ]
  8. // 转换为
  9. [
  10. {
  11. "id": 1,
  12. "name": "部门1",
  13. "pid": 0,
  14. "children": [
  15. {
  16. "id": 2,
  17. "name": "部门2",
  18. "pid": 1,
  19. "children": []
  20. },
  21. {
  22. "id": 3,
  23. "name": "部门3",
  24. "pid": 1,
  25. "children": [
  26. // 结果 ,,,
  27. ]
  28. }
  29. ]
  30. }
  31. ]

时间复杂度

时间复杂度的计算并不是计算程序具体运行时间,而是算法执行语句的次数。

计算方法

  1. 选取相对增长最高的项
  2. 最高项系数都为1
  3. 若是常数的话用O(1)表示

    空间复杂度

    递归实现

    ``` /**
    • 递归查找,获取children */ const getChildren = (data, result, pid) => { for (const item of data) { if (item.pid === pid) { const newItem = {…item, children: []}; result.push(newItem); getChildren(data, newItem.children, item.id); } } }

/**

  • 转换方法 */ const arrayToTree = (data, pid) => { const result = []; getChildren(data, result, pid) return result; }
  1. <a name="SJnrM"></a>
  2. ### 递归实现总结
  3. 1. data 原数据 result 保存结果 pid 根id
  4. 2. getChildren(data,result,pid)
  5. 3. 遍历data 把 item.pid = pid 保存到 result
  6. 4. 递归调用 getChildrenI(data,item.children,item.id)
  7. <a name="mQpIc"></a>
  8. ### 不用递归
  9. <a name="oHHEZ"></a>
  10. #### 主要思路:
  11. 先把数据转成Map去存储,之后遍历的同时借助对象的引用,直接从Map找对应的数据做存储

function arrayToTree(items) { const result = []; // 存放结果集 const itemMap = {}; //

// 先转成map存储 for (const item of items) { itemMap[item.id] = {…item, children: []} }

for (const item of items) { const id = item.id; const pid = item.pid; const treeItem = itemMap[id]; if (pid === 0) { result.push(treeItem); } else { if (!itemMap[pid]) { itemMap[pid] = { children: [], } } itemMap[pid].children.push(treeItem) }

} return result; }

  1. <a name="jyayU"></a>
  2. #### 思路总结
  3. items 原数据 result 处理后的对象
  4. 1. 先把 items数据,根据 id 转为 Map
  5. 2. 循环 items id = 0 保存到 result 其他在 Map 里面找到对应父级,添加到children中
  6. 3. 到最后 pid = 0 也会被添加children
  7. <a name="mFEVK"></a>
  8. ### 最优解

function arrayToTree(items) { const result = []; // 存放结果集 const itemMap = {}; // for (const item of items) { const id = item.id; const pid = item.pid;

  1. if (!itemMap[id]) {
  2. itemMap[id] = {
  3. children: [],
  4. }
  5. }
  6. itemMap[id] = {
  7. ...item,
  8. children: itemMap[id]['children']
  9. }
  10. const treeItem = itemMap[id];
  11. if (pid === 0) {
  12. result.push(treeItem);
  13. } else {
  14. if (!itemMap[pid]) {
  15. itemMap[pid] = {
  16. children: [],
  17. }
  18. }
  19. itemMap[pid].children.push(treeItem)
  20. }

} return result; }

```