Algorithm 排序表简化二叉树的构造

Algorithm 排序表简化二叉树的构造,algorithm,sorting,data-structures,language-agnostic,binary-tree,Algorithm,Sorting,Data Structures,Language Agnostic,Binary Tree,我有一组项目,应该是一个平衡的二叉树。每个项都是数据的形式,父项,数据是有用的信息,父项是二叉树中父节点的索引 树中的节点从左到右逐行编号,如下所示: 1 ___/ \___ / \ 2 3 _/\_ _/\_ 4 5 6 7 这些元素存储在链接列表中。我应该如何排列此列表,以便更容易构建树?每个父节点将被索引引用,恰好由两个子节点引用;如果我按父索引对它

我有一组项目,应该是一个平衡的二叉树。每个项都是数据的形式,父项,数据是有用的信息,父项是二叉树中父节点的索引

树中的节点从左到右逐行编号,如下所示:

           1
       ___/ \___
      /         \
     2           3
   _/\_        _/\_
  4    5      6    7

这些元素存储在链接列表中。我应该如何排列此列表,以便更容易构建树?每个父节点将被索引引用,恰好由两个子节点引用;如果我按父索引对它们进行排序,排序必须是稳定的。

我想我不明白您到底想实现什么。必须编写在树中插入项的函数。例如,无论输入数据是如何排序的,红黑树都具有相同的插入复杂性,即Olog n。是否有您必须使用的特定实现或插入时必须达到的特定速度目标


PS:听起来像是我的家庭作业:

你可以根据父字段,按递增顺序对列表进行任何排序

结果将是这样一个列表:

[(d_1,nil), (d_2,1), (d_3,1) , (d_4,2), (d_5,2), ...(d_i,x), (d_i+1,x) ]
     ^ 
   the root has no parent...
注意,在这个列表中,因为我们使用了一个稳定的排序-对于排序列表中的每两对d_i,x,d_i+1,x,d_i是左叶

现在,您可以在中填充树

因为这是家庭作业,我仍然希望你确保你自己理解所有的事情。所以我不想给出答案。如果您有任何具体问题,请发表意见-我将尝试编辑并解释相关部分的更多细节


奖励:这种组织的结果是实现结构的一种非常常见的方式,它是一个完整的二叉树,但为了性能,我们通常将其存储为一个数组,这与这种方法生成的输出非常相似。

听起来您想要一个二叉树,允许您从叶节点转到其祖先,使用数组

通常,在将列表放入二叉树之前对其进行排序会导致二叉树不平衡,除非您使用TRAP或其他Ologn数据结构

将完整的二叉树存储在数组中的常用方法是使节点i有两个子节点2i和2i+1

如果该组织不是排序而是组织,则可以通过使用整数算法将数组索引除以2(将截断分数),从叶节点转到父节点


如果您的二叉树并不总是完整的,那么最好忘记使用数组,而是使用带有指针/引用的更传统的树结构。

构建树是什么意思?您已经有了它-以您指定的奇怪格式。@ivan_pozdeev我需要它作为实际的树,而不是可以作为树查看的列表。用链接列表实现的二叉树?基线链表将否定二叉树的优点。@Gumbo它是一个定义树的链表。从这个列表中,我需要构建实际的树。这个列表包含什么?数据、家长信息?只有数据?另外:每个父节点将由索引引用,正好由两个子节点引用-是树吗?还是我们不知道?是否需要重新创建完全相同的树?完全相同的结构?谢谢,我明白了当我回复你的评论时,我意识到按父索引排序实际上是我所需要的解决方案。@PaulManta:我很高兴听到你自己设法得到它!请注意,使用稳定排序非常重要,而不是任何排序,否则答案将是错误的!