javascript - 如何在不递归的情况下将列表转换为二叉树

标签 javascript list tree

作为练习,我尝试在不使用递归的情况下将列表转换为二叉树。

这基本上就是我卡住的地方。

var items = [
  { a: 1 }, { a: 10 }, { a: 100 }, { a: 20 }, { a: 2 },
  { a: 3 }, { a: 30 }, { a: 300 }, { a: 40 }, { a: 4 }
]

var top = {}

for (var i = 0, n = items.length; i < n; i+=2) {
  var a = items[i]
  var b = items[i + 1]

  top.left = { data: a }
  top.right = { data: b }

  top = top.right
}

top = top.right 显然是不正确的,它使得只有一个扩展树的分支被创建,所以它基本上只是一个链表和一个叶子的小芽在每个级别。

    /\
     /\
      /\
       /\
        /\
          \

我很难理解如何向下所有树的分支将节点按顺序放入二叉树中,以便它们可以迭代/以它们在列表中的原始顺序遍历。我不确定这叫什么,如果我应该做一些版本的 DFS/BFS inorder/preorder/postorder,我不太确定。想知道是否有人可以在 JS 中演示如何做到这一点。

我什至不确定输出应该是什么,但如果我不得不猜测它会是这样的:

             top
       1             10
  100     20      2      3
30  300  40 4

最佳答案

您可以使用两个索引,一个用于节点 列表,另一个用于目标 列表。然后,将接下来的两个节点放在 target 节点的左右两侧。

继续,直到没有更多节点可用。

这棵树没有空的起始节点。

var items = [{ a: 1 }, { a: 10 }, { a: 100 }, { a: 20 }, { a: 2 }, { a: 3 }, { a: 30 }, { a: 300 }, { a: 40 }, { a: 4 }],
    tree = items[0],
    i = 1,
    j = 0;

while (i < items.length) {
    items[j].left = items[i++];
    if (i >= items.length) break;
    items[j].right = items[i++];
    j++;
}

console.log(tree);
.as-console-wrapper { max-height: 100% !important; top: 0; } 

稍微短一点的方法。

var items = [{ a: 1 }, { a: 10 }, { a: 100 }, { a: 20 }, { a: 2 }, { a: 3 }, { a: 30 }, { a: 300 }, { a: 40 }, { a: 4 }],
    tree = items[0],
    i = 1,
    side = 'right';

while (i < items.length) {
    side = { left: 'right', right: 'left' }[side];
    items[(i - 1) >> 1][side] = items[i++];
}

console.log(tree);
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 如何在不递归的情况下将列表转换为二叉树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55096349/

相关文章:

javascript - 如何在 Blade 文件 laravel 5.6 中获取当前路由名称

javascript - 错误 : "cannot read property ' nodename' of undefined"While converting html Table

C 插入排序 - 实现

python - Python 中的字符串或列表替换

c - 通过从堆中删除值并向堆中插入值来同步文件和堆中的数据

javascript - Polymer 示例不适用于 Firefox

c# - 通用列表修改 C# 中的属性值

mysql - 更新 MySQL 中的缓存计数

javascript - 如何在 D3.js 中更改径向树的根

javascript - 不是类中的函数