【问题标题】:Building a tree from nodes with only depth and bottom-most children information从只有深度和最底层子节点信息的节点构建树
【发布时间】:2013-09-25 06:46:16
【问题描述】:

我正在重写一个旧项目。出于神秘的原因(遗留公司数据库,无法更改),树形数据以一种特殊的方式存储在数据库中:每个节点都定义了两个属性:节点深度和最底层深度子​​节点的列表。

我将如何处理将其转换为常规树?我目前处于将一组所有节点放置在树中的级别,但我现在不知所措。我想到的一件事是从最深层次添加节点并上升到根节点,但这很麻烦悬空节点和调整树的大小。

编辑:刚刚意识到我的方法将涉及检查较低级别节点的每个组合,以找到其子节点总和等于较高级别节点的节点。没有。

【问题讨论】:

    标签: algorithm data-structures language-agnostic tree


    【解决方案1】:

    只需按深度对节点进行排序,然后逐级插入节点。

    只有一个根(深度 0 或 1,取决于您的输入),所以第一步很容易。

    在一般步骤中,您需要将下一级的每个节点分配给正确的父节点。标准很简单:子节点的最底部子节点是父节点最底部子节点的子集。如果运行时间不是问题,只需对照所有父节点检查每个子节点,直到找到匹配项。如果这太慢,请添加评论,我会想更多;-)

    【讨论】:

    • "just check each child node against all parent nodes" - 如果可以的话,你为什么要这样做,正如你所说,只检查孩子的祖先之一是否包含在父母的祖先中?
    • @Dukeling 父节点是指深度为i 的所有节点,子节点是深度为i+1 的所有节点。据我所知,没有简单的方法来决定孩子属于哪个父母,因此您需要全部尝试并查看您拥有哪个子集。
    • 好吧,你只需要检查一个孩子的祖先是否包含在父母的祖先中(只要节点是唯一的,这个检查就足够了)(这将是 O(n) 而不是O(n^2) 或 O(log n) 而不是 O(n) 如果您使用排序列表(与本机检查所有节点相比,即交集,过程)。
    • @Dukeling 是的,这都是真的。但是由于 OP 没有提到任何关于节点唯一性的内容,所以我没有将其视为理所当然。另一方面,如果节点不是唯一的,则问题可能无法确定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多