偏平数据结构转Tree
let arr = [{id: 1, name: '部门1', pid: 0},{id: 2, name: '部门2', pid: 1},{id: 3, name: '部门3', pid: 1},{id: 4, name: '部门4', pid: 3},{id: 5, name: '部门5', pid: 4},]// 转换为[{"id": 1,"name": "部门1","pid": 0,"children": [{"id": 2,"name": "部门2","pid": 1,"children": []},{"id": 3,"name": "部门3","pid": 1,"children": [// 结果 ,,,]}]}]
时间复杂度
时间复杂度的计算并不是计算程序具体运行时间,而是算法执行语句的次数。
计算方法
- 选取相对增长最高的项
- 最高项系数都为1
- 若是常数的话用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; }
<a name="SJnrM"></a>### 递归实现总结1. data 原数据 result 保存结果 pid 根id2. getChildren(data,result,pid)3. 遍历data 把 item.pid = pid 保存到 result4. 递归调用 getChildrenI(data,item.children,item.id)<a name="mQpIc"></a>### 不用递归<a name="oHHEZ"></a>#### 主要思路:先把数据转成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; }
<a name="jyayU"></a>#### 思路总结items 原数据 result 处理后的对象1. 先把 items数据,根据 id 转为 Map2. 循环 items id = 0 保存到 result 其他在 Map 里面找到对应父级,添加到children中3. 到最后 pid = 0 也会被添加children<a name="mFEVK"></a>### 最优解
function arrayToTree(items) { const result = []; // 存放结果集 const itemMap = {}; // for (const item of items) { const id = item.id; const pid = item.pid;
if (!itemMap[id]) {itemMap[id] = {children: [],}}itemMap[id] = {...item,children: itemMap[id]['children']}const treeItem = itemMap[id];if (pid === 0) {result.push(treeItem);} else {if (!itemMap[pid]) {itemMap[pid] = {children: [],}}itemMap[pid].children.push(treeItem)}
} return result; }
```
