关于树的显示的算法

fqst 2002-10-23 09:37:19
对于一组树状关系的节点,现在需要把它在界面上显示出来,就是像组织关系图、软件模块分解图等的显示方式,请问有没有这方面的相关资料,或者提供提供思路,不甚感激。
...全文
26 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
yourfeng 2002-11-20
  • 打赏
  • 举报
回复
我也要!多谢yourfeng@eyou.com
一大梨 2002-11-15
  • 打赏
  • 举报
回复
...
hokersun 2002-11-02
  • 打赏
  • 举报
回复
“我有C语言的源代码,你要么?”

为什么不贴出来
zyplwt 2002-11-02
  • 打赏
  • 举报
回复
给我也来一份吧,谢谢.zyplwt@163.net
会思考的草 2002-11-01
  • 打赏
  • 举报
回复
偶也要
bidongming@263.net
3x
linshao16 2002-11-01
  • 打赏
  • 举报
回复
VC里有CTree的对象可以用,我用过,还比较好用
tycjg 2002-10-30
  • 打赏
  • 举报
回复
我想要c的源代码,给我发一份吧,谢谢。sxtycjg@sohu.com
rmq 2002-10-26
  • 打赏
  • 举报
回复
我想要c的源代码,给我发一份吧,谢谢。rmq10@eyou.com
xuning80 2002-10-26
  • 打赏
  • 举报
回复
也给我一份吧,3x,uing@vip.sina.com
liufucsdn 2002-10-26
  • 打赏
  • 举报
回复
我想要c的源代码,给我发一份吧,谢谢。liufububai@21cn.com
sxzbj 2002-10-25
  • 打赏
  • 举报
回复
可以在树的输出时,添加一个数组,用于记录上一个节点的坐标,可以根据这个坐标为它的子节点产生一个线,长度自己设定。
zhoukun666 2002-10-25
  • 打赏
  • 举报
回复
我有C语言的源代码,你要么?
djniulihao 2002-10-25
  • 打赏
  • 举报
回复
现在的可视化编程资料里,都有树的控件,很容易实现你的功能的。自己查吧
hithong2002 2002-10-24
  • 打赏
  • 举报
回复
讨论如下。
在 vb6.0里,当在界面控件绘图时,必须使用其坐标系统。该坐标系与笛卡儿坐标系大致相同但略有差别。主要在于其纵坐标的正向是垂直向下的。如图所示:
vb6.0中界面控件的基本绘图过程有circlelineprint等,其中
circle过程的功能为画一个圆,其
语法格式为:circle(x,y),r —— (x,y)为圆心坐标,r为半径长度。
Line过程的功能为画一条直线,其
语法格式为:line(x1,y1)—(x2,y2) ——(x1,y1)(x2,y2)为两端点坐标
print过程的功能是在系统当前坐标位置输出指定字符,坐标位置为字符所在文本框的左上角。其语法格式为:print code —— code为代表输出字符的变量
要实现树的形象输出,有下列3个主要问题①结点的输出 ②结点之间的坐标函数③树枝与边的输出。
① 结点的输出。用circle过程实现一个圆(此圆在本文里称“输出圆”)的输出,然后用print过程实现结点的代码输出。由于print过程是以系统当前坐标位置(currentX,currentY)作为输出指定字符所在文本框的左上角顶点坐标的方式来输出指定字符的,如果以圆心(x,y)直接作为(currentX,currentY)的值,则会出现部分字符的笔画位于圆之外的情况(如右图 )。为此,必须做出修正。
② 结点之间的坐标函数。这里将树与图分开讨论。对于二元树,先给定根结点的坐标,然后主要遵循2个原则来确定结点之间的坐标函数:以根结点为第一层,则结点层数越低,与之相邻的树枝越长,左右树枝的夹角越大。所以在确定不同层的左右儿子的时候应有所区别;左右儿子之间应有所区别。
③ 树枝与边的输出。仍将树与图分开讨论。对于二元树,由于其树枝的取向总局限于笛卡儿坐标系的象限平分线附近,故将问题简化,用以结点输出圆圆心为基准,左下(上)方和右下(上)方45度处圆弧上的点为树枝输出(入)点。对于图,则必须解出过边的两个端点的直线与两个输出圆之间的交点,作为边的端点。
对于问题①,建立模型修正如下:
设圆心(px,py),欲输出结点所在文本框的左上角顶点坐标(CurrentX, CurrentY)则
CurrentX = px - rx
CurrentY = py – ry
对于不同的系统和字体,休整值(rx,ry)不完全一致。以5号字为例,取(50,130)。
对于问题②结点之间的坐标函数,
二元树的模型如下图,已知根结点坐标(rootx,rooty)

设树的层数为total,结点0的左右儿子所在层数分别为level1,level2,则有
x1 = x0- (total-level1) * dx
y1 = y0 + dy (x1,y1)为左儿子
x2 = x0+ (total-level1) * dx
y2 = y0 + dy (x1,y1)为右儿子
dx,dy为输出圆圆心坐标的单位横,纵坐标变化值。
源程序大致如下:
点坐标定义过程
Private Sub getseat()
Dim i As Integer
seat(1).x = 3200:seat(1).y = 500:
For i = 2 To 3
seat(i).y = 1500:seat(i).x = (i - 2) * 3200 + 1600 + 300
Next i
For i = 4 To 7
seat(i).y = 2500:seat(i).x = (i - 4) * 1600 + 800 + 300
Next i
For i = 8 To 15
seat(i).y = 3500:seat(i).x = (i - 8) * 800 + 400 + 300
Next i
For i = 16 To 31
seat(i).y = 4500:seat(i).x = (i - 16) * 400 + 200 + 300
Next i
For i = 32 To 63
seat(i).y = 5500:seat(i).x = (i - 32) * 200 + 100 + 300
Next i
End Sub
图形输出过程:
Private Sub printout(i As Integer)
Dim px, py, fatherx, fathery As Integer
CurrentX = seat(i).x: CurrentY = seat(i).y
px = CurrentX: py = CurrentY: fatherx = seat(tree(i).father).x: fathery = seat(tree(i).father).y
If tree(i).data <> 32767 Then
Circle (px, py), 100: CurrentX = px – 130: CurrentY = py – 60: Print tree(i).data
If tree(i).father = 32767 Then
ElseIf i = tree(tree(i).father).lchild Then
Line (fatherx - 70, fathery + 70)-(px + 70, py - 70)
ElseIf i = tree(tree(i).father).rchild Then
Line (fatherx + 70, fathery + 70)-(px - 70, py - 70)
End If
End If
End Sub
你再改改吧



33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧