如何从边缘制作二叉树? [关闭]

Posted

技术标签:

【中文标题】如何从边缘制作二叉树? [关闭]【英文标题】:How to make binary tree from edges? [closed] 【发布时间】:2013-02-08 03:22:53 【问题描述】:

我从 from 的输入中获取二叉树的所有边

   parentId childId
   e.g. 0 3 // means from node 0 to node 3
   // 0 does not mean root of the tree.

我如何从中构造树?

【问题讨论】:

【参考方案1】:

执行此操作的一种方法是分两次执行此操作:

    组装树中的所有链接。 找到树的根。

要组装所有链接,您可以首先构建一个以每个节点的 ID 为键的哈希表(如果您知道 ID 都在 0 ... N 范围内,则可以构建一个适当大小的巨型数组对于 N 的一些选择)。每当您从文件中读取一行时,您都可以执行以下操作:

    如果节点不存在,其 ID 由起点和终点指定,则创建这些节点并将其左右指针初始设置为 NULL。 将第二个节点添加为第一个节点的子节点。 (我假设这不是二叉搜索树,所以孩子的顺序无关紧要。如果这是二叉搜索树,那么您可以根据找到的内容设置适当的孩子指针)。李>

要找到树的根,您可以创建一组节点作为根节点的候选节点,它最初是树中的每个节点。然后,您可以遍历到目前为止已构建的节点。每次你发现一个节点 v 是另一个节点 u 的子节点时,你可以从候选根集合中删除节点 v(因为它是一个子节点)。完成后,您将留下所有可能的根集。如果边列表确实定义了一棵二叉树,那么这将只是一个节点。如果它定义了一个二叉树的森林,这将返回森林中所有树的根。

总的来说,这需要 O(n) 时间,其中 n 是边数(也是树中的节点数,因为二叉树中的边数是节点数减一)。

如果您愿意,您可以将这两个通道合并为一个通道;为了便于展示,我只是分别对它们进行了描述。

希望这会有所帮助!

【讨论】:

【参考方案2】:

首先你建立一个节点 id 的映射,连接节点列表 然后遍历地图并从地图中的信息创建从链接到链接

如果是二叉树,那么文件中缺少信息,应该有格式

parent、leftChild、rightChild 或 或者左右总是相同的顺序(左在前),每个节点两行,第二行在下一行。

【讨论】:

文件原样没有问题,不必采用您建议的格式。每个节点最多只有 2 行(作为父节点),每个子节点一个。 是的,但是左子树应该永远是第一个,

以上是关于如何从边缘制作二叉树? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

二叉树遍历和延伸

反转二叉树(从左到右)[关闭]

二叉树遍历树未完成[关闭]

c_cpp 获得二叉树的边缘和高度

如何在laravel的二叉树中注册用户[关闭]

为啥 Java 8 中的哈希映射使用二叉树而不是链表? [关闭]