【问题标题】:How to draw a tree with an arbitrary number of children?如何绘制具有任意数量孩子的树?
【发布时间】:2020-04-21 21:46:23
【问题描述】:

我正在努力想出一种算法,该算法允许我绘制树状数据结构,其中每个节点可以有 0..n 个子节点。 我的问题是,我不知道我必须将节点放置多远才能使子节点不会重叠。

在本例中,“d”是“b”的子代,“g”是“e”的子代,当我将子代均匀分布在其父代之上时,它们在 x 轴上重叠树的宽度。

              g g g g g g g g   (9 nodes)
              \ \ \ \ | / / /
d d d d d d d d d     e         (10 nodes)
\ \ \ \ / / / / /     |
       b              c         (2 nodes)
           \      /
              a                 (1 node)

节点不以任何方式排序。所以它实际上更像是一个看起来像一棵树的图表。

【问题讨论】:

  • 您能否具体说明您如何定义重叠?在您的示例中,您想要 10 列还是 18 列(= 9 g's + 9d's)?
  • 我想要18个。这样所有“g”的x坐标都大于“d”的x坐标。
  • 是的,你的回答让我走上了正轨。非常感谢!

标签: graph tree draw graph-algorithm


【解决方案1】:

为了确定间距,我建议使用一个由三个主要步骤组成的算法。我们将使用graph theory的语言:要绘制的树由nodesabc、...组成。

  • 步骤 1. 我们首先确定每个节点的 ,它测量 根节点的距离 @987654329 @。我们假设您已将树准备为adjacency list,它主要是一个包含 2 列的表,每个edge 的起始节点和结束节点。在给定的示例中,我们有a - ba - cb - d1、...b - d9c - ee - g1、...e - g9。注意节点命名方案,它明确地解决了dg 的多重性。我们最终得到这样的表格:
# node: layer
a: 0
b: 1
c: 1
d1: 2
d2: 2
...
d9: 2
e: 2
g1: 3
g2: 3
...
g9: 3
  • 第 2 步。 我们还必须确定和跟踪每层的节点总数以及每层 leaf nodes 的数量,即没有任何继任者的节点。叶子可以很容易地在邻接列表中识别为仅出现在第二列而不是第一列的节点标识符。在给定的示例中,第 0 层和第 1 层没有叶子,第 2 层有 9 个叶子,即d1...d9,第 3 层只有叶子e1...e9。在这个阶段,我们构建了下表:
# layer: leave nodes, overall nodes, non-leave nodes (in this layer)
0: 0, 1, 1
1: 0, 2, 2
2: 9, 10, 1
3: 9, 0, 0
  • 第 3 步。 最后,我们使用列累积叶计数扩展刚刚创建的表。我们所做的只是总结我们已经遇到了多少叶节点:
# layer: cumulative nodes
0: 0
1: 0
2: 9
3: 18

结果为 18,即显示无重叠树所需的列数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多