Family Tree display
我正在创建一个家谱计划。我的问题是如何定位节点?最初我将根定位在我的屏幕的中心,如果它是一个完美的二叉树并且水平非常低,它可以正常工作。然而,情况并非最常见。这是一个示例树: -
1 2 3 4
| A
B C
D E F I J
K L N O |
如您所见,主要问题是关于节点的位置。如果一个节点有很多子节点并且它的相邻节点也有很多子节点,它们往往会重叠。(主要问题)我在Silverlight中使用Canvas对节点进行绝对定位。如果您不是Silverlight开发人员,则可能不会烦恼Silverlight和Canvas部分。我只需要如何定位节点的逻辑。
通过知道树的级别总数,树的高度可以很容易地计算出来,但是树的宽度让我很烦恼。如何计算树的宽度(画布的总宽度)
有人可以给我一些关于如何设置画布宽度的一般指导,以及哪些逻辑对于节点的定位是完美的。
注意: - 我不是要求整个算法,这不是我的功课。我已经有了算法和数据库。我只需要节点定位部分的指南。
提前致谢 :)
-
你能澄清一下画布的宽度是什么意思吗。它是特定级别的节点总数吗?
-
@Algorithmist: - 我的意思是画布宽度是水平显示区域,树是完全显示自己所需的。 Canvas是我的树的容器(实际显示的位置)。它不是特定级别的节点总数。但你可以说树的宽度。您可能认为它是任何特定宽度的最大节点数。但事实并非如此。例如,第5级可能有10个孩子,第6级只有4个孩子(5级第1节点有2个孩子,第5级第10个节点有2个孩子),那么树的显示宽度会有所不同。
-
@Algorithmist: - 如果你不明白我想说的话,很抱歉。如果你需要我将在一张纸上绘制并上传该图片,然后你会看到更好理解的链接。让我知道。
-
我们不能逐级遍历树级并检查节点是否有右子节点。对应每个节点我们可以保留一定数量的固定宽度(比如5个空格)。现在我们逐层遍历树级别然后检查它是左边还是右边的孩子。如果第一个节点的水平没有孩子,那么我们可以将宽度设置为10.真的很好的问题。我也在思考让我们看看高级的孩子们要说些什么。
-
@Algorthmist: - Really good problem谢谢。
如果为该树的任意节点实现函数:width(node),则很容易定位每个节点
可以递归地定义此函数:
- 对于高度为1的树,它就是这个节点的长度
- 对于高度大于1的树,这是此节点的所有直接子节点的长度之和(加上这些节点之间的一些空格)
如果你想猜测画布的宽度,我建议从树的最宽层开始。您可以通过遍历树宽度优先计算。将该级别的节点数乘以每个节点所需的横向空间量,并获得所需的画布宽度。
但是,这并不能保证最宽级别的相邻节点不会有很多子节点。因此,为了执行没有重叠的间距,首先将树的叶子定位在最深层,然后向后穿过树,在上面添加父母并将叶子放入间隙和侧面。
-
- 最广泛的水平是我所需要的。 最宽的是画布的宽度。 但是我们不能直接假设具有最大节点数的级别是最宽的级别。 你可以阅读我对上面的Algorithmist的回复。For example the 5th level may have 10 children and 6th level has just 4 children (2 children for 1st node of 5th level and 2 children for 10th node of 5th level) then the display width of the tree would be different.
-
- start by positioning the leaves of the tree at the deepest level and traverse the tree backwards。 这正是我的想法。 但是这里也存在问题。 我应该在哪里定位最深层节点? 适用什么配方?
我建议放大和缩小功能,以便整理GUI Real Estate。
一个有很多孩子的节点可以被分组,一个特殊的图标来表示它可以放大到下一个级别我会觉得很好,随着家庭的成长,因为用户可以首先获得大图,然后可以放大任何分支他祝福。
从谷歌地图的UI获取提示可能会有所帮助。
-
- 我喜欢你的建议,但这并不是我打算建立的。 我正在尝试构建myheritage.com的精确克隆。 您可以在那里查看树构建过程。 它很美丽 :)
-
为什么确切克隆? 给新的东西;)
-
- 首先让我根据他们的辛勤工作来构建他们所建立的东西。 如果我达到那个水平,那么我只能考虑给予额外的东西;)