题目:将以下数据格式转换成数组格式,并且再由数组恢复成下列格式,数组的具体字段自行定义,不强烈要求。(写出两个函数,其一:二叉树转换成数组; 其二:将数组转换成二叉树)
数据格式
const treeData = {
name: 1,
children: [
{
name: 2,
children: [
{
name: 4,
children: [{
name: 7,
children: []
}],
}, {
name: 5,
children: [],
},
]
},
{
name: 3,
children: [
{
name: 6,
children: [],
},
],
},
],
}解法:
1、拿到这个题后,第一件事就是确认数组的格式,转换成数组后,肯定需要一个字段来维持节点和父节点的关系,结构如下:
2、我想到的解法就是递归,第二个函数将数组转回二叉树时,面试官说了句不必用递归,至今未想到别的方法,希望有灵感的同学给点思路。
const transfer = (data, result, parent) => {
result.push({name: data.name, parentKey: parent});
const children = data.children;
children[0] && transfer(children[0], result, data.name);
children[1] && transfer(children[1], result, data.name);
return result;
}
const transferReverse = (data, parentKey) =>{
if(parentKey === 0){
let tree = {name: data[0].name, children:[]};
tree.children = transferReverse(data, data[0].name);
return tree;
} else {
let someChildren = data.filter(item => item.parentKey === parentKey).map(item => ({name: item.name, children: []}));
someChildren[0] && ( someChildren[0].children = transferReverse(data, someChildren[0].name) );
someChildren[1] && ( someChildren[1].children = transferReverse(data, someChildren[1].name) );
return someChildren;
}
}
const treeArray = transfer(treeData, [], 0);
console.info(treeArray);
console.log(transferReverse(treeArray, 0))