我想从非常不寻常的输入构建二叉树。输入包含:
节点总数。
根的整数标签。
所有边的列表(连接到每个边的顶点/节点) 其他)。列表中的边缘是UNSORTED,只有一个规则 确定左/右孩子 - 出现边缘的孩子 列表中的第一个始终在左侧。顶点对中子/父的顺序也是随机的。
我已经提出了一些直接的解决方案,但它们需要在所有边缘列表中进行多次搜索(我基本上找到了带有标记根的2条边,然后对所有边重复此过程子树。)
对于拥有大量节点的树,我认为这种直接的方法非常低效,但我无法想出其他任何内容。
有哪些想法可以提供更有效的算法来解决这个问题?
这是一个示例,可以更好地实现可视化:
INPUT:5个节点,根标签2,边缘列表:[(1,0),(1,2),(2,3),(1,4)]
树看起来像这样:
wait $pidof_process_1 $pidof_process_2
答案 0 :(得分:2)
重要的是澄清给定的边缘列表是否被指示。
如果以有向的方式给出边(即,声明任何给定的边AB也包括A是B的父节点的信息)将边存储在adjacency list中,同时记录入射边的数量数组中的每个顶点都应该足够了。一旦你通过数组的传入边缘,具有0个传入边(即父节点)的顶点应该是根。然后,您可以以线性时间复杂度运行DFS来遍历图,并将其放入最适合您需求的任何数据结构中。
如果给出的边缘是无向的,则方案会有所改变。在这种情况下,您没有传入和传出边缘的概念。在这种情况下,由于没有指定数组的结构(例如BST等),您基本上可以将具有少于3个边的节点视为root并运行DFS,如上所述。 (具有单个子节点的所有叶子和中间节点)
答案 1 :(得分:1)
一个简单的解决方案是:“链接树中的所有边缘!”
开始准备字典。如果起点和终点不存在节点,请创建节点。因为它本质上是随机的,所以最初可以将它们的左右指针设置为NULL。 你有规则 - “列表中首先出现的边缘的孩子总是在左边。”所以相应地创造孩子。 此外,您已经知道树的根,因此您可以遍历到目前为止构建的节点。
通过这个你可以一次生成树。
希望这有帮助!