关于算法:Family Tree显示

Family Tree display

我正在创建一个家谱计划。我的问题是如何定位节点?最初我将根定位在我的屏幕的中心,如果它是一个完美的二叉树并且水平非常低,它可以正常工作。然而,情况并非最常见。这是一个示例树: -

1
2
3
4
            A
        B       C
    D   E   F   I   J
K   L               N   O

如您所见,主要问题是关于节点的位置。如果一个节点有很多子节点并且它的相邻节点也有很多子节点,它们往往会重叠。(主要问题)我在Silverlight中使用Canvas对节点进行绝对定位。如果您不是Silverlight开发人员,则可能不会烦恼Silverlight和Canvas部分。我只需要如何定位节点的逻辑。

通过知道树的级别总数,树的高度可以很容易地计算出来,但是树的宽度让我很烦恼。如何计算树的宽度(画布的总宽度)

有人可以给我一些关于如何设置画布宽度的一般指导,以及哪些逻辑对于节点的定位是完美的。

注意: - 我不是要求整个算法,这不是我的功课。我已经有了算法和数据库。我只需要节点定位部分的指南。

提前致谢 :)


如果为该树的任意节点实现函数:width(node),则很容易定位每个节点

可以递归地定义此函数:
- 对于高度为1的树,它就是这个节点的长度
- 对于高度大于1的树,这是此节点的所有直接子节点的长度之和(加上这些节点之间的一些空格)


如果你想猜测画布的宽度,我建议从树的最宽层开始。您可以通过遍历树宽度优先计算。将该级别的节点数乘以每个节点所需的横向空间量,并获得所需的画布宽度。

但是,这并不能保证最宽级别的相邻节点不会有很多子节点。因此,为了执行没有重叠的间距,首先将树的叶子定位在最深层,然后向后穿过树,在上面添加父母并将叶子放入间隙和侧面。


我建议放大和缩小功能,以便整理GUI Real Estate。

一个有很多孩子的节点可以被分组,一个特殊的图标来表示它可以放大到下一个级别我会觉得很好,随着家庭的成长,因为用户可以首先获得大图,然后可以放大任何分支他祝福。

从谷歌地图的UI获取提示可能会有所帮助。