当前位置: 首页 > 知识库问答 >
问题:

从其边缘列表(节点对)构造二叉树

孟正志
2023-03-14

我想从一个非常不寻常的输入中构造一个二叉树。输入包含:

>

  • 节点总数。

    根的整数标签。

    所有边(相互连接的顶点/节点)的列表。列表中的边缘是未排序的,只有一个规则用于确定左/右子项 - 列表中首先出现的边缘中的子项始终位于左侧。顶点对中子/父的顺序也是随机的。

    我已经提出了一些直截了当的解决方案,但它们需要通过所有边缘的列表进行多次搜索(我基本上会找到具有标记根的2个边缘,并对所有子树重复此过程。

    我认为这种简单的方法对于具有大量节点的树来说效率很低,但我想不出其他方法。

    有什么更有效的算法来解决这个问题吗?

    下面是一个更好的可视化示例:

    输入:5 个节点,根标记为 2,边缘列表:[(1,0),(1,2),(2,3),(1,4)]

    树看起来像这样:

            2
        1       3
     0     4
    
  • 共有2个答案

    袁泓
    2023-03-14

    一个简单的解决方法是:“把树中的所有边都连接起来!”

    开始准备字典。如果起点和终点处不存在节点,请将其创建为节点。由于它本质上是随机的,您可以将其左指针和右指针初始设置为NULL。您有一条规则——“列表中第一个出现的边中的子项始终位于左侧。”。因此,创建相应的子对象。此外,您已经知道了树的根,因此可以迭代到目前为止构建的节点。

    通过这个,你可以一次生成树。

    希望这有所帮助!

    章哲彦
    2023-03-14

    重要的是要澄清给定的边缘列表是否被声明为定向的。

    如果边以有向方式给出(即,任何给定的边 A-B 也包括 A 是 B 的父级的信息),则将边存储在邻接列表中,同时记录数组中每个顶点的传入边数应该足够了。一旦你遍历了传入边的数组,具有0个传入边(即父项)的顶点应该是根。然后,可以按线性时间复杂度运行 DFS 以遍历图形,并将其放在最适合你需求的任何数据结构中。

    如果给定的边被认为是无向的,那么这个方案会有一点改变。在这种情况下,你没有传入和传出边的概念。在这种情况下,由于没有指定阵列的结构(例如BST等。)你基本上可以把任何少于3条边的节点当做根,如上所述运行DFS。(具有单个子节点的所有叶节点和中间节点)

     类似资料:
    • 前言 为了配置kubernetes中的traefik ingress的高可用,对于kubernetes集群以外只暴露一个访问入口,需要使用keepalived排除单点问题。本文参考了kube-keepalived-vip,但并没有使用容器方式安装,而是直接在node节点上安装。 定义 首先解释下什么叫边缘节点(Edge Node),所谓的边缘节点即集群内部用来向集群外暴露服务能力的节点,集群外部的

    • 我有一个二叉树,我想打印所有非边界节点。边界节点:-所有叶节点从根到最左节点路径上的所有节点所有节点从根到最右节点。 我在树结构中使用了一个额外的布尔值来确定它是否是边界节点,如果不是边界节点,则进行遍历和打印。有人能想出一个更好的方法吗,因为它使用了一些额外的空间(虽然很少)。

    • 问题内容: 我正在构造一个二叉树。让我知道这是否是正确的方法。如果没有,请告诉我怎么做?我在构建通用二进制树的代码已找到的地方找不到合适的链接。BST的每个地方都已编码。 这是我要制作的二叉树。我应该能够进行所有的树遍历。 问题答案: 我认为这是您要寻找的:

    • class Node(object): def __init__(self, data, left=None, right=None): self.data = data self.left = left self.right = right tree = Node(1, Node(3, Node(7, Node(0)), Node(6)), Node(2, Node

    • 我正在研究一个算法问题。给定n,生成存储值1的所有结构唯一的二进制搜索树。。。n、 解决方案是枚举序列中的每个数字i,并使用该数字作为根,其左侧的子序列1…(i-1)将位于根的左分支上,类似地,右侧的子序列(i 1)…n位于根的右分支上。然后从子序列递归地构造子树。这种方法确保构建的BST都是唯一的,因为它们有唯一的根。 现在我的问题是:如果树不限于二叉搜索树,如果它可以是任何二叉树,该怎么办。解

    • 我正在使用cytoscape来显示我用GraphViz制作的一个图表。我从cytoscape应用商店安装了附加的点应用程序,以便能够加载我的图表。 我的图形加载完美,所有的边都连接到所需的节点。但是我的节点和边的属性没有显示出来。 下面是一个不起作用的简化示例(少了属性、节点和边): 你知道为什么我的属性不能加载吗?我试着在我的图上破坏和创建视图,但它什么也做不到。两个图的节点表都只有“共享名”和