原始数组
1
| const originArr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
|
将数组转为二叉树

如上图的二叉树所示,是一个按照层序遍历生成的二叉树。
最终的数据格式应该是这样的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| const BTree = { nodeName: 1, left: { nodeName: 2, left: { nodeName: 4, left: { nodeName: 8, }, right: { nodeName: 9, } }, right: { nodeName: 5, left: { nodeName: 10, }, right: { nodeName: 11, } } }, right: { nodeName: 3, left: { nodeName: 6, left: { nodeName: 12, }, right: { nodeName: 13, } }, right: { nodeName: 7, left: { nodeName: 14, }, right: { nodeName: 15, } } } }
|
思路
- 创建一个空对象,先确定二叉树的根节点
- 创建一个数组将根节点存进去
- 遍历这个数组,每次给遍历到的节点添加 left 和 right 节点
- 然后把 left 和 right 节点 push 到 nodes 这个数组里,继续遍历
- 最终的 BTree 就是需要的二叉树
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]; function arr2BTree() { const rootNode = { nodeName: arr[0] }; const BTree = rootNode; const treeNodes = [BTree]; let index = 0; for (const node of treeNodes) { index++; if (index > arr.length - 1) { break; } node.left = { nodeName: arr[index] }; treeNodes.push(node.left); index++; if (index > arr.length - 1) { break; } node.right = { nodeName: arr[index] }; treeNodes.push(node.right); } return BTree; } const BTree = arr2BTree(); console.log("BTree:", BTree);
|
将二叉树还原为数组(广度优先遍历)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| function BTree2arr() { const arr = []; const treeNodes = [BTree]; for (const node of treeNodes) { arr.push(node.nodeName); if (node.left) { treeNodes.push(node.left); } if (node.right) { treeNodes.push(node.right); } } return arr; } const originArr = BTree2arr(); console.log("originArr:", originArr);
|