当前位置:文档之家› 二叉排序树的可视化实现

二叉排序树的可视化实现

3.4.2 先序次序输入字符序列建立二叉树 在文本框中先序次序输入字符序列(如 abc**de*g**f***,其中“*”表示子树为空),调
用 LinkedBinaryTree(String s, int pred)方法建立二叉树,然后调用 show 方法可视化显示二叉
树。所建二叉树如图 3 所示。
在 文 本 框 中 输 入 二 叉 树 的 广 义 表 形 式 , 如 a(b(c,d(e,f)),i(j,k(x,y))) , 调 用 LinkedBinaryTree(String s)方法建立二叉树,然后调用 show 方法可视化显示二叉树。所建二 叉树如图 3 所示。
图 3 广义表形式建立二叉树
Binary tree object oriented description and visualization
Yangxiaobo
(The department of information engineering, Tibet Nationalities Institute, Xian Yang 712082)
化的显示,并将先序、中序和后序三种遍历算法实现动态同步可视化,这将对学生的学习提
供莫大的帮助,同时也可激发学生更浓厚的学习兴趣。
2.二叉树的面向对象描述
2.1 顶点类的设计
public class BinaryTreeNode { private BinaryTreeNode left;//The left child
Abstract:In the field of computer science, binary tree is a very important non linear structure, the realized of the visualization of binary tree has important significance. In this paper ,it is realized the visualization of binary tree by using object-oriented method and the features of complete binary tree, achieved the visualization of traversing binary tree algorithm , the dynamic visual traversing process and the algorithm of dynamic demonstration synchronously. Keywords: binary tree, visualization, object-oriented,data structure, complete binary tree
二叉排序树的可视化实现
杨晓波
摘 要:在计算机科学领域中,二叉树是一种非常重要的非线形结构,实现其可视化具有重 要意义。本文运用面向对象方法,利用完全二叉树特点实现了二叉树的可视化,实现了周游 二叉树算法的计算可视化, 实现了动态可视遍历过程和算法的动态演示同步进行。
关键词: 二叉树;可视化;面向对象;数据结构;完全二叉树 中图分类号: TP311.12 文献标识码:A 基金资助 教育部科学技术研究重点项目“西藏文物普查与旅游开发的三维影像建模技术” (编号 208137)
图 2 非完全二叉树的可视化结果
3.3 窗口刷新问题 另外在绘图的过程中,如果直接在窗口绘图,那么当发生窗口刷新(比如窗口最小化后
恢复正常)或窗口被覆盖等情况时,所绘图形将被擦除。为避免这种情图形将被擦除的情况。 3.4 二叉树可视化的应用 3.4.1 广义表形式建立二叉树
…… }
public void show() {//可视显示二叉树
…… } …… }
其中 root 成员表示二叉树的根; cursor 成员表示当前结点,称光标; 方法 LinkedBinaryTree()构造一棵空二叉树 方法 LinkedBinaryTree(String s) 构造一棵二叉树,字符串 s 是二叉树的广义表形 式,如 a(b(c,d(e,f)),i(j,k(x,y))) 方法 LinkedBinaryTree(String s) 构造一棵二叉树,字符串 s 是二叉树的先序遍历 序列,如 abc**de*g**f***,其中“*”表示子树为空 方法 drawNode() 在绘图区域绘制二叉树中的结点 方法 drawEdge() 在绘图区域绘制二叉树的边 方法 show()在指定的窗体上可视显示二叉树,
…… } public LinkedBinaryTree(String s,int pred) {//先序次序输入字符序列建立二叉树 …… } public void createPoint() {//设置完全二叉树的可视坐标
…… } public void drawNode() {//绘制结点
…… } public void drawNode() {//绘制边
1.引言
树形结构在许多方面有应用,可表示层次关系、从属关系和并列关系等。在计算机科 学领域中,树形结构是一种非常重要的非线形结构。计算机应用中常出现的嵌套数据,在各 种算法问题中,如文件管理、数据库、编译等系统中的算法,都可用树形结构得来表示。二 叉树是树形结构的另一种重要类型,许多算法问题用二叉树形式来解决简单灵活,而且树形 结构都可以转换成一棵与之对应的二叉树。因此,二叉树是树形结构的关键组成部分,有关 二叉树的各种算法也是学习数据结构课程的的重点和难点。数据结构及其算法的教学难点在 于它们的抽象性和动态性,我们在学习二叉树的算法时就遇到了难题:首先基于结构化的程 序设计思想的算法比较烦琐,同时由于传统的程序设计将数据与操作分开,是孤立地看待问 题,对于记录每个顶点的状态,维持各顶点之间的联系比较麻烦。用C或Pascal描述数据结 构,不能很好地实现抽象数据类型的思想,只有用C++或Java的类才能很自然地实现抽象数 据类型的思想,这为改良教学内容,促进软件复用和设计良好的软件架构,打下了坚实的基 础[1];其次学生上机验证二叉树的建立算法时无从知道建立的二叉树是否与所想建立的一 致;另外先序、中序和后序三种遍历的动态过程也无法形象直观的得以展现。因此我们若采 用面向对象方法描述二叉树,并为学生提供一些接口,能在屏幕上将学生建立的二叉树可视
private BinaryTreeNode right;//The right child private Object data;//The data in this node private int id; private int x,y; }
顶点类的基本成员有 left、right 和 data,left 表示结点的左子树,right 表示结点的右子 树,data 表示结点的数据域。为将复杂的数据结构以直观易懂的形式展现在屏幕上,应设计 可视数据结构。可视数据结构就是在顶点类的基本属性和操作的基础上,增加可视属性(如 顶点大小,颜色,坐标值等),并提供可视化接口供程序调用[2]。因此为了实现二叉树的可 视化增加三个成员 id、x 和 y,id 表示结点的完全化编号,x,y 表示结点的可视化坐标。 2.2 二叉树的二叉链表实现------二叉链表类的设计
图 1 完全二叉树的可视化结果
3.2 非完全二叉树的可视化实现 对于非完全二叉树,由于形态各异,为了实现起来简单而且对各种形态的二叉树均适用,
运用非完全二叉树完全化的思想来实现,在结点类中增加了一个完全化编号成员,因此各结 点的坐标采用完全二叉树中对应结点的坐标,便可很容易的实现非完全二叉树的可视化。非 完全二叉树的可视化实现如图 2 所示。
3 二叉树的可视化实现
3.1 完全二叉树的可视化实现 由于屏幕的大小是确定的,所以要将二叉树绘制在这片弹丸之地并非易事。对于教学而
言达到教学的目的就可以了,所以我们可对二叉树的高度加以限制,限制二叉树的高度最多 为 6 层,如此二叉树的大小也就限定了,最多有 63 个结点,即满二叉树。所以现在的问题 转化为将含 63 个结点的二叉树实现可视化,而可视化的关键是为 63 个结点设置坐标。我们 利用完全二叉树的的特点来实现,方法如下:可将绘图区域分成 6 层,每一层确定坐标的结 点个数和高度为 6 的完全二叉树的每层结点个数相同,即第一层 1 个,第二层 2 个,第三层 4 个,第四层 8 个,第五层 16 个,第六层 32 个。先确定第六层各个结点的坐标,将绘图区 域 x 轴平分为 33 份,得到 32 个坐标。第五层各个结点的坐标用第六层各个结点的坐标计算 得到,计算出第六层每两个结点横坐标的中点坐标,即第六层第 1 和第 2 个结点横坐标的中 点坐标便是第五层第 1 个结点的横坐标,依此类推,各层结点的横坐标便可确定。每层的结 点的纵坐标一样,需要说明的是为了保证视觉效果各层的纵坐标应拉开一定的距离,如第一 层的纵坐标为 10,第二层的纵坐标为 50,依此类推。这一过程由 createPoint()方法来实现。 接下来就是绘制结点和边的问题了,由方法 drawNode()和 drawEdge ()来实现。完全二叉树 的可视化实现如图 1 所示。
public class LinkedBinaryTree //implements BinaryTree { protected BinaryTreeNode root;
protected BinaryTreeNode cursor; protected Point p[]=new Point [64]; public LinkedBinaryTree() { root=null; cursor=null; } public LinkedBinaryTree(String s) {//广义表形式建立二叉树
图 4 先序次序输入字符序列建立二叉树
3.4.3 动态可视遍历过程和算法的动态演示同步进行的实现 我们在设计动画时采用基于形状的动画。基于形状的动画也称为“子画面”动画,是更
相关主题