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