C++ 如何从边生成二叉树?

C++ 如何从边生成二叉树?,c++,algorithm,data-structures,tree,binary-tree,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. 如何从中构造树?一种方法是分两步进行: 组装树中的所有链接 找到树的根 要组装所有链接,您可以首先构建一个由每个节点的ID键控的哈希表(或者一个大小合适的巨型数组,如果您知道ID都在0…N范围内,可以选择N)。无论何时从文件中读取一行,都可以执行以下

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

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

如何从中构造树?

一种方法是分两步进行:

  • 组装树中的所有链接
  • 找到树的根
  • 要组装所有链接,您可以首先构建一个由每个节点的ID键控的哈希表(或者一个大小合适的巨型数组,如果您知道ID都在0…N范围内,可以选择N)。无论何时从文件中读取一行,都可以执行以下操作:

  • 如果节点的ID由起点和终点指定,则创建这些节点并将其左指针和右指针初始设置为NULL
  • 将第二个节点添加为第一个节点的子节点。(我假设这不是一个二元搜索树,所以子级的顺序无关紧要。如果这是一个二元搜索树,那么您可以根据找到的内容设置适当的子级指针)
  • 要查找树的根,可以创建一组作为根节点候选节点的节点,根节点最初是树中的每个节点。然后可以遍历到目前为止构造的节点。每次发现一个节点v是另一个节点u的子节点时,可以从候选根集中删除节点v(因为它是子节点)。完成后,将剩下所有可能根的集合。如果边列表确实定义了一个二叉树,那么这将只是一个节点。如果它定义了一个二叉树的森林,这将返回森林中所有树的根

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

    如果你想的话,你可以把这两次传球变成一次传球;为了便于演示,我刚刚分别描述了它们


    希望这有帮助

    首先,您要构建一个节点id映射,以列出连接的节点
    然后,我浏览地图,并从地图中的信息创建从、到链接

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

    父项、左项、右项或

    或者左和右总是按相同的顺序排列(先左),每个节点有两行,第二行在下一行。

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