我正在创建一个家谱计划。我的问题是如何定位节点?最初我将根定位在我的屏幕的中心,如果它是一个完美的二叉树并且水平非常低,它可以正常工作。然而,情况并非最常见。这是一个示例树: -
A
B C
D E F I J
K L N O
如您所见,主要问题在于节点的位置。如果一个节点有很多子节点并且它的相邻节点也有很多子节点,则它们倾向于重叠。(主要问题)我在Silverlight中使用Canvas对节点进行绝对定位。如果您不是Silverlight开发人员,则可能不会烦恼Silverlight和Canvas部分。我只需要如何定位节点的逻辑。
树的高度可以通过知道树的总层数来相当容易地计算,但树的宽度令我感到不安。如何计算树的宽度(画布的总宽度)
有人可以给我一些关于如何设置画布宽度的一般指导原则以及哪些逻辑对于节点的定位非常有用。
注意: - 我不是要求整个算法,这不是我的功课。我已经有了算法和数据库。我只需要节点定位部分的指南。
提前致谢:)
答案 0 :(得分:5)
如果为该树的任意节点实现函数width(node)
,则很容易定位每个节点
这个函数可以递归定义:
- 对于树高1的树,这正是这个节点的长度
- 对于高度大于1的树,这是此节点的所有直接子节点的长度之和(加上这些节点之间的一些空格)
答案 1 :(得分:0)
我建议放大和缩小功能,以便整理GUI Real Estate。
一个有许多孩子的节点可以被分组,一个特殊的图标表示它可以放大到下一个级别,我觉得随着家庭的成长,我会感觉很好,因为用户可以先获得大图,然后可以放大他也希望任何一个分支。
从谷歌地图的UI中获取提示可能会有所帮助。
答案 2 :(得分:0)
如果你想猜测画布的宽度,我建议从树的最宽层开始。您可以通过遍历树宽度优先计算。将该级别的节点数乘以每个节点所需的横向空间量,并获得所需的画布宽度。
但是,这并不能保证最宽级别的相邻节点不会有很多子节点。因此,为了执行没有重叠的间距,首先将树的叶子定位在最深处,然后向后移动树,在上面添加父母并将叶子放入间隙和侧面。