如何绘制此输入的二叉树:[1,2,2,3,null,null,3,4,null,null,4]?

How to draw the binary tree for this input: [1,2,2,3,null,null,3,4,null,null,4]?

这是我画的

我显然遗漏了什么。如何包含数组索引 10 处的值? 我会很感激你的帮助。

数组编码不是这样的,您可以假设节点的 children 位于索引 i*2+1i*2+2 处。如果编码树是 complete 二叉树,那将是正确的,但如果不是,则不能使用此公式。

相反,您应该在构建树时跟踪树的底层,仅注册 真实 个节点(而不是 null)。然后把下一个children分布在(then)底层的节点之间等等,这真是一个breadth-first的遍历方式

这是程序:

创建一个队列,并为输入列表中的第一个值创建一个节点(如果列表不为空),并将其入队。

然后重复,只要有更多的输入要处理:

  • 从队列中取出一个节点
  • 从输入中读取接下来的两个值,并为它们创建节点。如果输入中没有足够的剩余值,请改用 null
  • 将这两个节点作为 children 附加到您从队列中取出的节点
  • 那些 children 不是 null 的应该在队列中排队。

如果将此算法应用于示例输入 [1,2,2,3,null,null,3,4,null,null,4],那么我们首先得到根,它放在队列。所以就在循环开始之前我们有:

        root: 1        queue = [1]
                       remaining input = [2,2,3,null,null,3,4,null,null,4]

我在这里用数字描述了队列内容,但它们确实是节点实例。

在循环的第一次迭代之后,我们从输入中读取 2 和 2,为它们创建节点,将它们附加到出队节点,并将这些 children 入队,我们得到:

        root: 1        queue = [2, 2]
             / \       remaining input = [3,null,null,3,4,null,null,4]
            2   2

迭代 #2 后(注意没有空值入队):

        root: 1        queue = [2, 3]
             / \       remaining input = [null,3,4,null,null,4]
            2   2
           / *
          3    

第 3 次迭代后:

        root: 1        queue = [3, 3]
             / \       remaining input = [4,null,null,4]
            2   2
           / * * \
          3       3

第 5 次迭代后:

        root: 1        queue = [3, 4]
             / \       remaining input = [null,4]
            2   2
           / * * \
          3       3
         / *
        4

最终迭代后:

        root: 1        queue = [4, 4]
             / \       remaining input = []
            2   2
           / * * \
          3       3
         / *     * \
        4           4

队列不为空,但由于没有更多的输入,那些排队的节点代表不需要进一步处理的叶子。