文章编号:1008-2980(2000)04-0086-05
用VB 制作数据结构课程中的
二叉树控件
Ξ
释 兵
(滨州师范专科学校,山东滨州256604)
摘要:讨论了数据结构课程中的二叉树控件的设计和实现,并给出了它的
一个应用实例.
关键词:二叉树;遍历;ActiveX 控件
中图分类号:TP 311.12 文献标识码:A
0 引 言
使用面向对象的语言进行程序开发的人都知道:OOP 的一个非常关键的元素就是控件.控件是提供程序可视界面的可重用对象,比如像文本框、标签、命令按钮等.控件具有属性、方法和响应事件,我们可以通过属性控制控件的外观和行为,使用控件的方法可以避免许多乏味的编程任务,利用控件的响应事件可以响应鼠标或键盘或其他的一些动作.有了控件使我们进行程序开发变得非常简单,同时缩短了开发时间,提高了开发效率.因此控件的使用和创建越来越成为一个热门的话题.
数据结构是计算机专业的一门重要的专业基础课,在这门课程中有一类非常重要的数据结构:二叉树,有很多算法都是基于它来完成的.在实际教学、学习过程中,二叉树这一部分也是较难讲解和理解的,因此在教学过程有必要开发一些多媒体课件来辅助教学.VB 作为一种较简单可视化的开发语言,在制作课件方面可以说是一种比较好的工具.用VB 制作课件时,如果再有一些与课程有关并且功能比较完备的控件作辅助,无疑将大大简化工作量,提高工作效率.本文就介绍一下数据结构课程中的二叉树控件的制作过程.
1 创建ActiveX 控件的基本步骤
定制控件可以很简单,也可以很复杂,这取决于用户的想法,VB 中有一项非常优秀的功能就是Ac 2tiveX Control Interface Wizard ,它使新的控件基于已经存在的控件,但是由于这个向导生成的代码有些麻
烦,因此作者介绍一下手工创建.手工创建控件的步骤主要有以下几步:
(1)启动一个ActiveX 控件类型的新项目.单击File 菜单选择New Project ,在VB 的New Project 对
话框中选择ActiveX Control 图标,单击O K 按钮.
(2)使用工具箱中其他控件画出新控件的界面,与画窗体一样.(3)加入实现控件行为的代码.
第16卷第4期Vol.16,No.4 滨州师专学报Journal of Binzhou Teachers College
2000年12月
Dec.,2000Ξ
收稿日期:2000-10-09
作者简介:释兵(1976—
),男,山东邹平人,滨州师专计算机科学系助教,从事计算机应用研究.
(4)加入代码提供属性、方法和事件,控件要将它们提供给使用控件的应用程序.(5)在VB 环境中加入一个新的Standard.EXE 项目,用它测试和调试控件.(6)将控件编译成为.OCX 文件.
下面将详细说明二叉树控件的定制.
2 二叉树控件的设计和实现
111 新建工程和画出控件界面
启动Visual Basic ,选择“新建工程”,再选择ActiveX Control.在新建的窗体中添加一个Picture Box 控件作为容器并修改其name 属性为Container ,然后在容器中添加个数为30的标签控件数组(在这里假设二叉树上最多有30个结点,这对于教学来说应该够用了),用标签控件来表示二叉树的结点.设置它们的Visible 属性值为False ,即使它们都不可见.112 添加类型说明代码
本控件中建立了一个结点类型和一个栈类型.结点类型用来定义二叉树上的结点,栈类型是用来实现二叉树的基本操作算法.两个类型的结构如下:
结点类型:Public Type TreeNodel
Caption As String ′结点的显示文本Parent As Integer ′父结点下标Lchild As Integer ′左孩子结点下标Rchild As Integer ′右孩子结点下标Weight As Single ′结点权值Depth As Integer ′结点的深度Col As Integer
控件的使用′结点在容器中的列号FColor As OL E -COLOR ′结点前景BColor As OL E -COLOR
′结点背景
End Type
栈类型:Public Type Stack Type
Stack (30)As Integer
′栈元素Top As Integer
′栈顶指针
End Type
113 定制控件方法并调试代码
本控件设置了以下6种方法:建立二叉树,结点之间动画连线,设置结点可见性,设置结点的前景和背景,清除连线和清除二叉树等.由于最后三种方法的实现比较简单,因此下面主要详细说明一下前两种方法的实现过程.
11311建立二叉树 Public Sub Creat Tree (ex Tree ()As TreeNodel ,Nodenum As Integer ,Boot As Int
eger )
′其中Ex Tree ()是一个结点类型的数组,存放二叉树中所有结点的信息;Nodenum 是结点个数;Boot 是根结点的下标.
建立二叉树就是根据用户输入的结点信息,在容器中画出结点和结点间的连线.比如有六个结点:1,2,3,4,5,6.其中结点1的左右孩子结点分别是2和3,结点2的右孩子结点是4,结点3的左右孩子结点
分别是5和6.那么建立的二叉树如图1所示.
现在的问题是如何让程序自动合理的在容器中摆放结点的位置.作者采用了如下的办法解决了这个问题:假设把整个容器用网格划分,网格的行数等于树的深度,网格的列数等于结点的个数.然后再把结点
78第4期 释兵 用VB 制作数据结构课程中的二叉树控件
移动到相对应的网格中去就可以了.但如何知道每一个结点在哪一个网格中呢?由图1可以看出结点所
在网格的行值应等于结点的深度(图1中结点1在第一行,结点2,3在第二行,结点4,5,6在第三行);
列值应等于结点在中序遍历二叉树的遍历序列中的位置.如图1所示的二叉树如果对其进行中序遍历,遍历序列为:2,4,1,5,3,6,这就是说结点2在第一列;结点4在第二列;结点1在第
三列;…;结点6在第六列.这样就确定出了每一个结点的行值和列值,从而可以正确、合理的摆放结点了.建树的过程实现如下:
Public Sub Creat Tree (ex Tree ()As TreeNodel ,Nodenum 图1 二叉树实例As Integer ,Boot As Integer )′建立二叉数,其中Ex Tree ()是一个结点类型的数组,存放二叉树中所有结点
的信息;′Nodenum 是结点个数;Boot 是根结点的下标.
Dim GridWidth As Single Dim GridHeight As Single
Call Midorder (Boot ) ′中序遍历二叉树Call G etdepth
′求树中各结点的深度GridWidth =Pictruel.width/(Nodenum +1)′求表格宽度GridHeight =Picturel.Height/Deep ′求表格高度
LabWidth =TreeNode.Item (0).Width/2Labheigh =TreeNode.Item (0).Height/2On Error G oto err
′出错时进入错误处理程序
′画结点即在正确的位置上使结点可见.For i =1To Nodenum
TreeNode.Item (i -1).Caption =extree (i ).Caption
TreeNode.Item (i -1).Move Picturel.Left +GridWidth 3(extree (i ).Col -1),-GridHeight 3(extree (i ).Depth -1)+100TreeNode.Item (i -1).Visible =True
Next i
′连线
For i =1To Nodenum
If extree (i ).Parent <>0Then
Picturel.Line (TreeNode.Item (i -l ).Left +LabWidth ,TreeNode.Item (i -l ).Top +Lab 2Height )-(TreeNode.Item (extrr (i ).Parent -1).Left +LabWidth ,TreeNode.Item (extree (i ).Parent -l ).Top +LabHeight )
End If Next i
err :On Error G o To 0′简单的错误处理
End Sub
11312 在结点间动画连线的方法 两结点间的连线可以是动画即有一定的时间延迟.动画连线过程如
下:
Private Sub MyLine (con1As Label ,con2As Label ,Part As Integer ) ′在标签控件con1和con2之间
连线,Part 为线段的分段数
88
滨州师专学报 第16卷
Dim C As Integer While C <=Part
X1=con1.Left +con1.Width/2X1=con1.Top +con1.Height/2X2=con2.Left +con2.Width/2Y2=con2.Top +con2.Height/2If C >0Then
x =X1+(C -1)3(X2-X1)/Part y =Y1+(C -1)
3
(Y2-Y1)/Part
X1=X1+C 3(X2-X1)/Part Y1=Y1+C 3(Y2-Y1)/part
′消除画线时的抖动:Picturel.AutoRedraw =
False con1.Refresh Con2.
Refresh
Picture1.Line (X1,Y1)-(,y )con1.Refresh con2.Refresh
Picturel.AutoRedraw =True
B KWait (100) ′一段连线完成后,程序延迟100ms ,这是一个自编的过程.
End If C =C +1 Wend End Sub
Public Sub MakeLink (Controll As Integer ,Control2As Integer ,part As Integer )
′两节点间动画连线,Controll 和Control2分别为两结点的下标,Part 为分段数.
On Error G o To err Linknodel =Controll Linknode2=Control2Linkpart =Part
Call MyLine (TreeNode.Item (Linknodel -1),TreeNode.Item (Linknode2-1),Linkpart )err :On Error G o To 0End Sub
114编译源程序生成控件
单击File 菜单,选择Make 3.OCX 菜单项,生成可以独立使用的.OCX 控件.
3 试用控件
添加新工程并插入一个新建的二叉树控件和三个按钮控件,然后将三个按钮的Caption 依次改为“建立二叉树”;“动画连线”“清除二叉树”,改二叉树控件的Name 为Etree 在“建立二叉树”按钮的Click 事件中添加如下代码:Binary Treel.Clean Tree
98第4期 释兵 用VB 制作数据结构课程中的二叉树控件
09 滨州师专学报 第16卷
ReDim extreel(6)As TreeNodel
Dim i As Integer
For i=1To6
extreel(i).Caption=Trim(Str(i))
Next i
extreel(1).Lchild=2 extreel(1).Rchild=3 extreel(1).Parent=0
extreel(2).Lchild=0 extreel(2).Rchild=5 extreel(2).Parent=1
extreel(3).Lchild=5 extreel(3).Rchild=6 extreel(3).Parent=1
extreel(4).Lchild=0 extreel(4).Rchild=0 extreel(4).Parent=2
extreel(5).Lchild=0 extreel(5).Rchild=0 extreel(5).Parent=3
extreel(6).Lchild=0 extreel(6).Rchild=0 extreel(6).Parent=3
Binary Treel.Creat Tree extreel(),6,1
在‘动画连线’按钮的Click事件中添加如下代码:
Etree.ClearLink ′清除连线
Etree.MakeLink(1,2,8) ′在结点1和2之间动画连线
在“清除二叉树”按钮的Click事件中添加如下代码:
Etree.Clean Tree运行窗体,单击“建树”按钮您将会看到图1所示的二叉树;单击“动画连线”按钮您将会看到在结点1和2之间连线的动画过程;单击“清除二叉树”按钮将清除掉屏幕上的二叉树.
作者已经用这个控件成功的做出了哈夫曼树及编码的演示课件,教学效果良好.
参 考 文 献
[1] 严蔚敏,吴伟民著.数据结构[M].第2版.北京:清华大学出版社,1995.
[2] Rob Thayer著.曾湘宁,方凌,译.Visual Basic6揭秘[M].北京:电子工业出版社,1999.
[3] Mike Mckelvy,Ronald Martinsen著,杨继平,译.Visual Basic5开发使用手册[M].北京:机械工业出
版社.1997,
Developing Binary T ree control in Data Structure using VB
Shi Bing
B i nz hou Teachers College,B i nz hou256604,Chi na
Abstract This paper first discusses the design and realization of binary tree control in data structure courses and then gives an example to show how to use the new control Visual Basic.
K ey w ords binary tree,traersing,ActiveX control
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论