背景
今天遇到一个题,需要将扁平数组转树结构,题目大致如下
将扁平数组转为树结构输出 pid0为根节点,id顺序可能不递增,pid可能不存在于数组内
给定输入
[
{id: 1, name: '111', pid: 0},
{id: 2, name: '222', pid: 1},
{id: 3, name: '333', pid: 1},
{id: 4, name: '444', pid: 3},
{id: 5, name: '555', pid: 4},
]
给定输出:
{
"id": 1,
"name": "111",
"pid": 0,
"children": [
{
"id": 2,
"name": "222",
"pid": 1,
"children": []
},
{
"id": 3,
"name": "333",
"pid": 1,
"children": [
// ...
]
}
]
}
思考
这个题当时用c++没有做出来,一看这个输出就是json格式,应该就是个前端的题,后来一搜果然。
不过用c++肯定也能写就是构造个树,递归去查找比较插入唄。额外支持一下要求的特例。后来还是用c++写了一下最后输出格式没弄。算法可能不是最优,先实现了吧。
写完也没明白用这个前端题来考什么,估计是应变能力吧,还是得加强算法练习,才能遇题不慌不乱。
上代码
由于题目要求,这里可能会存在多棵树(pid不在树内的情况)。
考虑到插入树时,若id不是顺序的,则会产生临时的N棵树,后续还要合并这些树,比较麻烦,就先排一下序,这样除非不在当前树内的,否则都能找到对应节点插入。
这里我们使用了preorder先序遍历的算法,在遍历时,判断pid 和id有无和待插入的元素有关系的,找到了就挂在树上。
有个特殊的情况是待插入元素会成为当前树的根,这里需要处理一下
#include
#include
#include
#include
总结
虽然是个前端题不过是涉及到树的遍历,用c++还是可以写的,平时还是需要多练习
还有就是这个总是提示大于10字的不足10行?