前端字节跳动算法二叉树和数组的转换

2,400 阅读1分钟

题目:将以下数据格式转换成数组格式,并且再由数组恢复成下列格式,数组的具体字段自行定义,不强烈要求。(写出两个函数,其一:二叉树转换成数组; 其二:将数组转换成二叉树)

数据格式


 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))