如何从边创建二叉树?

时间:2013-02-08 03:22:53

标签: c++ algorithm data-structures tree binary-tree

我从from

的输入中获取二叉树的所有边缘
   parentId childId
   e.g. 0 3 // means from node 0 to node 3
   // 0 does not mean root of the tree.

如何从中构建树?

2 个答案:

答案 0 :(得分:1)

这样做的一种方法是两次通过:

  1. 汇总树中的所有链接。
  2. 找到树的根。
  3. 要组装所有链接,您可以通过构建一个由每个节点的ID键入的哈希表(或者如果您知道ID全部在0 ... N范围内的大型数组)来开始对于某些选择N)。每当您从文件中读取一行时,您都可以执行以下操作:

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

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

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

      如果你愿意的话,你可以将这两个传球分成一个传球;我刚刚分别描述了它们以便于演示。

      希望这有帮助!

答案 1 :(得分:0)

首先构建节点id的映射到连接节点列表
然后遍历地图并创建from,来自地图中信息的链接

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

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