时间复杂度O(n)的数组转树结构算法

1,385 阅读1分钟

时间复杂度O(n)的数组转树结构算法

最近的工作单中遇到了这个问题,将接口给的数据结构转成树结构,于是就写了这个算法

测试数据

 var flatArr = [
     { id: 4, title: "节点4", parent_id: 3 },
     { id: 5, title: "节点5", parent_id: 4 },
     { id: 6, title: "节点6", parent_id: 2 },
     { id: 1, title: "节点1", parent_id: 0 },
     { id: 2, title: "节点2", parent_id: 0 },
     { id: 3, title: "节点3", parent_id: 2 },
 ];

完整代码

 ​
 function Node(id, title) {
     this.id = id;
     this.title = title;
     this.leaf = true;
     this.children = [];
 }
 ​
 Node.prototype.addChild = function (node) {
     this.leaf = false;
     this.children.push(node);
 };
 ​
 Node.prototype.setTitle = function (title) {
     this.title = title;
 };
 ​
 var list = new Map();
 ​
 flatArr.map(item => {
     var node = list.get(item.id);
     var parentNode = list.get(item.parent_id);
     if (node) {
         node.setTitle(item.title);
     } else {
         node = new Node(item.id, item.title);
         list.set(item.id, node);
     }
     if (parentNode) {
         parentNode.addChild(node);
     } else {
         let p = new Node(item.parent_id, "temp_node");
         list.set(item.parent_id, p);
         p.addChild(node);
     }
 });

输出结果

 console.log(JSON.stringify(list.get(0).children));
 ​
 //[{"id":1,"title":"节点1","leaf":true,"children":[]},{"id":2,"title":"节点2","leaf":false,"children":[{"id":6,"title":"节点6","leaf":true,"children":[]},{"id":3,"title":"节点3","leaf":false,"children":[{"id":4,"title":"节点4","leaf":false,"children":[{"id":5,"title":"节点5","leaf":true,"children":[]}]}]}]}]
 ​

总结

完美输出