4

我正在创建一个家谱程序。我的问题是如何定位节点?最初我将根定位在屏幕的中心,如果它是一个完美的二叉树并且级别非常低,它就可以正常工作。然而,大多数情况下并非如此。这是一个示例树:-

            A
        B       C
    D   E   F   I   J
K   L               N   O

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

通过知道树的总层数,可以很容易地计算出树的高度,但树的宽度是困扰我的问题。我如何计算树的宽度(画布的总宽度)

有人可以给我一些关于如何设置画布宽度以及哪些逻辑最适合节点定位的一般指导方针。

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

提前致谢 :)

4

3 回答 3

5

如果你实现一个功能:width(node)对于这棵树的任意节点,很容易定位每个节点

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

于 2011-02-19T06:33:12.863 回答
0

我建议提供放大和缩小功能以整理 GUI 房地产。

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

从谷歌地图的用户界面中获取线索,可能会有所帮助。

于 2011-02-19T06:29:08.100 回答
0

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

但是,这并不能保证最宽级别上的相邻节点每个都不会有很多子节点。因此,要执行不重叠的间距,首先将树的叶子放在最深的位置,然后向后遍历树,在上面添加父节点,然后将叶子放入间隙和侧面。

于 2011-02-19T06:37:20.597 回答