二叉排序树的可视化实现
二叉排序树

9
第9章
第三节
二、二叉排序树(插入)
查找
动态查找表
二叉排序树是一种动态查找表
当树中不存在查找的结点时,作插入操作
新插入的结点一定是叶子结点(只需改动一个 结点的指针) 该叶子结点是查找不成功时路径上访问的最后 一个结点的左孩子或右孩子(新结点值小于或 大于该结点值) 10
第9章
第三节
查找
19
在二叉排序树中查找关 键字值等于37,88,94
3
第9章
第三节
查找
动态查找表
二、二叉排序树(查找函数)中结点结构定义 二叉排序树通常采用二叉链表的形式进行存 储,其结点结构定义如下:
typedef struct BiNode { int data; BiNode *lChild, *rChild; }BiNode,*BitTree;
4
第9章
第三节
查找
动态查找表
2、二叉排序树的定义 定义二叉排序树所有用到的变量 BitTree root; int
//查找是否成功(1--成功,0--不成功) //查找位置(表示在BisCount层中的第几个位置
BisSuccess;
int
int
BisPos;
BisCount;
//查找次数(相当于树的层数)
7
第9章
第三节
查找
动态查找表
二、二叉排序树(查找函数)
else { BisSuccess = 0; root=GetNode(k);//查找不成功,插入新的结点}
} BiNode * GetNode(int k) { BiNode *s; s = new BiNode; s->data = k; s->lChild = NULL; s->rChild = NULL; return(s);}
数据结构c语言课设-二叉树排序

题目:二叉排序树的实现1 内容和要求1)编程实现二叉排序树,包括生成、插入,删除;2)对二叉排序树进展先根、中根、和后根非递归遍历;3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。
4)分别用二叉排序树和数组去存储一个班(50 人以上)的成员信息(至少包括学号、姓名、成绩3 项),比照查找效率,并说明在什么情况下二叉排序树效率高,为什么?2 解决方案和关键代码2.1 解决方案:先实现二叉排序树的生成、插入、删除,编写DisplayBST函数把遍历结果用树的形状表示出来。
前中后根遍历需要用到栈的数据构造,分模块编写栈与遍历代码。
要求比照二叉排序树和数组的查找效率,首先建立一个数组存储一个班的成员信息,分别用二叉树和数组查找,利用clock〔〕函数记录查找时间来比照查找效率。
2.2关键代码树的根本构造定义及根本函数typedef struct{KeyType key;} ElemType;typedef struct BiTNode//定义链表{ElemType data;struct BiTNode *lchild, *rchild;}BiTNode, *BiTree, *SElemType;//销毁树int DestroyBiTree(BiTree &T){if (T != NULL)free(T);return 0;}//清空树int ClearBiTree(BiTree &T){if (T != NULL){T->lchild = NULL;T->rchild = NULL;T = NULL;}return 0;}//查找关键字,指针p返回int SearchBST(BiTree T, KeyType key, BiTree f, BiTree &p) {if (!T){p = f;return FALSE;}else if EQ(key, T->data.key){p = T;return TRUE;}else if LT(key, T->data.key)return SearchBST(T->lchild, key, T, p);elsereturn SearchBST(T->rchild, key, T, p);}二叉树的生成、插入,删除生成void CreateBST(BiTree &BT, BiTree p){int i;ElemType k;printf("请输入元素值以创立排序二叉树:\n");scanf_s("%d", &k.key);for (i = 0; k.key != NULL; i++){//判断是否重复if (!SearchBST(BT, k.key, NULL, p)){InsertBST(BT, k);scanf_s("%d", &k.key);}else{printf("输入数据重复!\n");return;}}}插入int InsertBST(BiTree &T, ElemType e){BiTree s, p;if (!SearchBST(T, e.key, NULL, p)){s = (BiTree)malloc(sizeof(BiTNode));s->data = e;s->lchild = s->rchild = NULL;if (!p)T = s;else if LT(e.key, p->data.key)p->lchild = s;elsep->rchild = s;return TRUE;}else return FALSE;}删除//某个节点元素的删除int DeleteEle(BiTree &p){BiTree q, s;if (!p->rchild) //右子树为空{q = p;p = p->lchild;free(q);}else if (!p->lchild) //左子树为空{q = p;p = p->rchild;free(q);}else{q = p;s = p->lchild;while (s->rchild){q = s;s = s->rchild;}p->data = s->data;if (q != p)q->rchild = s->lchild;elseq->lchild = s->lchild;delete s;}return TRUE;}//整棵树的删除int DeleteBST(BiTree &T, KeyType key) //实现二叉排序树的删除操作{if (!T){return FALSE;}else{if (EQ(key, T->data.key)) //是否相等return DeleteEle(T);else if (LT(key, T->data.key)) //是否小于return DeleteBST(T->lchild, key);elsereturn DeleteBST(T->rchild, key);}return 0;}二叉树的前中后根遍历栈的定义typedef struct{SElemType *base;SElemType *top;int stacksize;}SqStack;int InitStack(SqStack &S) //构造空栈{S.base = (SElemType*)malloc(STACK_INIT_SIZE *sizeof(SElemType));if (!S.base) exit(OVERFLOW);S.top = S.base;S.stacksize = STACK_INIT_SIZE;return OK;}//InitStackint Push(SqStack &S, SElemType e) //插入元素e为新栈顶{if (S.top - S.base >= S.stacksize){S.base = (SElemType*)realloc(S.base, (S.stacksize + STACKINCREMENT)*sizeof(SElemType));if (!S.base) exit(OVERFLOW);S.top = S.base + S.stacksize;S.stacksize += STACKINCREMENT;}*S.top++ = e;return OK;}//Pushint Pop(SqStack &S, SElemType &e) //删除栈顶,应用e返回其值{if (S.top == S.base) return ERROR;e = *--S.top;return OK;}//Popint StackEmpty(SqStack S) //判断是否为空栈{if (S.base == S.top) return TRUE;return FALSE;}先根遍历int PreOrderTraverse(BiTree T, int(*Visit)(ElemType e)) {SqStack S;BiTree p;InitStack(S);p = T;while (p || !StackEmpty(S)){if (p){Push(S, p);if (!Visit(p->data)) return ERROR;p = p->lchild;}else{Pop(S, p);p = p->rchild;}}return OK;}中根遍历int InOrderTraverse(BiTree T, int(*Visit)(ElemType e)) {SqStack S;BiTree p;InitStack(S);p = T;while (p || !StackEmpty(S)){if (p){Push(S, p);p = p->lchild;}else{Pop(S, p);if (!Visit(p->data)) return ERROR;p = p->rchild;}}return OK;}后根遍历int PostOrderTraverse(BiTree T, int(*Visit)(ElemType e)) {SqStack S, SS;BiTree p;InitStack(S);InitStack(SS);p = T;while (p || !StackEmpty(S)){if (p){Push(S, p);Push(SS, p);p = p->rchild;}else{if (!StackEmpty(S)){Pop(S, p);p = p->lchild;}}}while (!StackEmpty(SS)){Pop(SS, p);if (!Visit(p->data)) return ERROR;}return OK;}利用数组存储一个班学生信息ElemType a[] = { 51, "陈继真", 88,82, "黄景元", 89,53, "贾成", 88,44, "呼颜", 90,25, "鲁修德", 88,56, "须成", 88,47, "孙祥", 87, 38, "柏有患", 89, 9, " 革高", 89, 10, "考鬲", 87, 31, "李燧", 86, 12, "夏祥", 89, 53, "余惠", 84, 4, "鲁芝", 90, 75, "黄丙庆", 88, 16, "李应", 89, 87, "杨志", 86, 18, "李逵", 89, 9, "阮小五", 85, 20, "史进", 88, 21, "秦明", 88, 82, "杨雄", 89, 23, "刘唐", 85, 64, "武松", 88, 25, "李俊", 88, 86, "卢俊义", 88, 27, "华荣", 87, 28, "杨胜", 88, 29, "林冲", 89, 70, "李跃", 85, 31, "蓝虎", 90, 32, "宋禄", 84, 73, "鲁智深", 89, 34, "关斌", 90, 55, "龚成", 87, 36, "黄乌", 87, 57, "孔道灵", 87, 38, "张焕", 84, 59, "李信", 88, 30, "徐山", 83, 41, "秦祥", 85, 42, "葛公", 85, 23, "武衍公", 87, 94, "范斌", 83, 45, "黄乌", 60, 67, "叶景昌", 99, 7, "焦龙", 89, 78, "星姚烨", 85, 49, "孙吉", 90, 60, "陈梦庚", 95,};数组查询函数void ArraySearch(ElemType a[], int key, int length){int i;for (i = 0; i <= length; i++){if (key == a[i].key){cout << "学号:" << a[i].key << " 姓名:" << a[i].name << " 成绩:" << a[i].grade << endl;break;}}}二叉树查询函数上文二叉树根本函数中的SearchBST()即为二叉树查询函数。
算法可视化演示软件开发毕业设计

算法可视化演示软件开发毕业设计目录前言 (1)第一章绪论 (2)第一节课题背景 (2)第二节课题的目的与意义 (2)第三节论文结构 (3)第二章相关知识概述 (4)第一节 Java知识相关概述 (4)一、Java的发展史 (4)二、Java的主要特性 (4)三、JDK 平台相关信息 (5)第二节 Java图形界面技术概述 (5)一、 Java Swing相关概述 (5)二、容器和布局 (7)三、事件处理 (8)第三节相关算法的介绍 (9)一、冒泡排序 (9)二、插入排序 (10)三、选择排序 (12)四、二叉查找树 (12)第四节本章小结 (15)第三章需求分析 (17)第一节系统功能需求 (17)一、系统设计目标 (17)二、系统功能需求 (17)第二节系统运行环境 (18)第三节本章小结 (18)第四章系统设计 (19)第一节系统总体描述 (19)第二节模块设计 (20)一、算法模块设计 (20)二、界面模块设计 (22)第三节系统流程图 (25)第四节本章小结 (26)第五章系统实现 (27)第一节可视化主界面的实现 (27)第二节排序算法界面所实现的功能 (28)第三节二叉查找树可视化功能的实现 (31)第四节本章小结 (33)第六章系统测试 (34)第一节问题解决及测试结果 (34)一、遇到的问题 (34)二、解决的方法 (34)三、测试结果 (34)第二节本章小结 (41)结论 (42)致谢 (43)参考文献 (44)附录 (45)一、英文原文 (45)二、英文翻译 (52)前言可视化( Visualizations)计算机图形学和图像处理技术,将数据转换成图形或图像在屏幕上显示出来,并进行交互处理的理论、方法和技术。
此次设计算法可视化( Algorithm Visualizations)就是利用可视化技术将算法可视化[1]。
排序是计算机程序设计中的一种重要操作,其功能是一个数据元素(或者记录)的任意序列,从新排列成一个按关键字有序的序列。
数据结构 二叉排序树

9.6.2 哈希函数的构造方法
构造哈希函数的目标:
哈希地址尽可能均匀分布在表空间上——均 匀性好; 哈希地址计算尽量简单。
考虑因素:
函数的复杂度; 关键字长度与表长的关系; 关键字分布情况; 元素的查找频率。
一、直接地址法 取关键字或关键字的某个线性函数值为哈希地址 即: H(key) = key 或: H(key) = a* key + b 其中,a, b为常数。 例:1949年后出生的人口调查表,关键字是年份 年份 1949 1950 1951 … 人数 … … … …
9.4 二叉排序树
1.定义:
二叉排序树(二叉搜索树或二叉查找树) 或者是一棵空树;或者是具有如下特性的二叉树
(1) 若它的左子树不空,则左子树上所有结点的 值均小于根结点的值;
(2) 若它的右子树不空,则右子树上所有结点 的值均大于等于根结点的值; (3) 它的左、右子树也都分别是二叉排序树。
例如:
H(key)
通常设定一个一维数组空间存储记录集合,则 H(key)指示数组中的下标。
称这个一维数组为哈希(Hash)表或散列表。 称映射函数 H 为哈希函数。 H(key)为哈希地址
例:假定一个线性表为: A = (18,75,60,43,54,90,46) 假定选取的哈希函数为
hash3(key) = key % 13
H(key) = key + (-1948) 此法仅适合于: 地址集合的大小 = = 关键字集合的大小
二、数字分析法
假设关键字集合中的每个关键字都是由 s 位数 字组成 (u1, u2, …, us),分析关键字集中的全体, 并从中提取分布均匀的若干位或它们的组合作为 地址。 例如:有若干记录,关键字为 8 位十进制数, 假设哈希表的表长为100, 对关键字进行分析, 取随机性较好的两位十进制数作为哈希地址。
线索二叉树

6.4 线索化二叉树从前面的讨论可知,遍历二叉树就是将非线性结构的二叉树线性化,即按一定规则将二叉树中的结点排列成一个线性序列依次访问。
如图6.20(a)所示的二叉树,经中序遍历得到线性序列:BADEC,经前序遍历得到线性序列:ABCDE,经后序遍历得到线性序列:BEDCA。
在这些线性序列中,二叉树中的每个结点(除第一个和最后一个外)有且仅有唯一的一个前趋和唯一的一个后继,很容易找到各个结点的直接前驱和直接后继。
但当以二叉链表作为二叉树的存储结构时,只能找到结点的左、右孩子,而不能直接找到前驱和后继,只有在遍历的动态过程中得到这些信息。
如果将这些信息在第一次遍历时保存起来,在需要再次对二叉树进行“遍历”时就可以将二叉树视为线性结构进行访问,从而简化遍历操作。
那么,如何存储遍历中得到的结点前驱和后继的信息呢?一个简单的办法是在每个结点上增加两个指针域fwd和bkwd,分别指向存储遍历中得到的结点前驱和后继。
fwd L child data R child bkwd这是采用多重链表来表示二叉树。
这种方法虽简单易行,但这种结构的存储密度将大大降低,浪费存储空间。
另一种方法,是利用原有链域L child 和R child的空链域。
在n个结点的二叉链表中有2n个孩子链域,其中仅有n-1个链域是用来指示结点的左右孩子,而另外n+1个链域是空链域。
现在把这些空链域利用起来,使其指向结点的前驱或后继;对那些原来就不为空的链域,则仍然指向左或右孩子。
如果把指向前驱和后继的指针称为线索(Thread),那么,如何区分指向左、右孩子的指针和指向前驱、后继的线索呢?在原结点结构上增加标志域定义为:0 Lchild为左指针,指向左孩子0 Rchild为右指针,指向右孩子ltag=rtag=1 Lchild为左线索,指向前驱 1 Rchild为右线索,指向后继以这种结点构成的二叉链表作为二叉树的存储结构,叫做线索链表,其C语言类型说明如下:Typedef struct ThreadTNode{enum{0,1} ltag, rtag;Elem Type data;Struct ThreadTNode *Lchild, *Rchild;}ThreadTNode, *ThreadTree;为了节省内存空间,我们用C语言的位段方法将结点中的左标志域和右标志域与数据域合并在一个存储单元中(即各用一位表示左标志和右标志,其余各位表示结点值)。
二叉排序树的实验报告

二叉排序树的实验报告二叉排序树的实验报告引言:二叉排序树(Binary Search Tree,简称BST)是一种常用的数据结构,它将数据按照一定的规则组织起来,便于快速的查找、插入和删除操作。
本次实验旨在深入了解二叉排序树的原理和实现,并通过实验验证其性能和效果。
一、实验背景二叉排序树是一种二叉树,其中每个节点的值大于其左子树的所有节点的值,小于其右子树的所有节点的值。
这种特性使得在二叉排序树中进行查找操作时,可以通过比较节点的值来确定查找的方向,从而提高查找效率。
二、实验目的1. 理解二叉排序树的基本原理和性质;2. 掌握二叉排序树的构建、插入和删除操作;3. 验证二叉排序树在查找、插入和删除等操作中的性能和效果。
三、实验过程1. 构建二叉排序树首先,我们需要构建一个空的二叉排序树。
在构建过程中,我们可以选择一个节点作为根节点,并将其他节点插入到树中。
插入节点时,根据节点的值与当前节点的值进行比较,如果小于当前节点的值,则将其插入到当前节点的左子树中;如果大于当前节点的值,则将其插入到当前节点的右子树中。
重复这个过程,直到所有节点都被插入到树中。
2. 插入节点在已有的二叉排序树中插入新的节点时,我们需要遵循一定的规则。
首先,从根节点开始,将新节点的值与当前节点的值进行比较。
如果小于当前节点的值,则将其插入到当前节点的左子树中;如果大于当前节点的值,则将其插入到当前节点的右子树中。
如果新节点的值与当前节点的值相等,则不进行插入操作。
3. 删除节点在二叉排序树中删除节点时,我们需要考虑不同的情况。
如果要删除的节点是叶子节点,即没有左右子树,我们可以直接删除该节点。
如果要删除的节点只有一个子树,我们可以将子树连接到要删除节点的父节点上。
如果要删除的节点有两个子树,我们可以选择将其右子树中的最小节点或左子树中的最大节点替代该节点,并删除相应的替代节点。
四、实验结果通过对二叉排序树的构建、插入和删除操作的实验,我们得到了以下结果:1. 二叉排序树可以高效地进行查找操作。
基于C#的二叉排序树图形显示系统研究与实现

二叉排序树在实际应用中 , 经常用来实现提高 数据的查寻效率 , 由于概念理解上的困难 , 但 在教学 过程中 , 学生往往不能掌握二又树 的基本操作 , 不能
在脑 海 中形 成 对应 的模 型 。所 以本 文试 图从概 念人
本系统在功能上 , 除了可以进行二叉排序树基 本操作 , 初始化、 节点的增加 、 删除、 清空所 有节点 外, 还对显示功能进行了强化 , 增加了颜色设置可以 设置界面背景颜色 、 节点的颜色和节点字体的颜色 , 还能进行二叉树节点间宽度的增大和缩小。
}
es le
{ Isr nd. eN d ,aa ; ne ( oeLf 时先要找到节点要插入 的位置, 然后在窗 1上显示出这个结点 , 3 直到所有输 人序列都插入到二叉树 中为止, 这些操作都是递归
进行 的。
} }
es le
二 叉 排 序 树 ( iaySr Te ) 称 二 叉 查 找 Bnr ot re 又
的窗 口和页面 , 只设计 了一个 主界 面 , 主界 面上完 在
成二叉排序树的显示 , 实现二叉树各种数据操作 。
( 搜索) ( i r Sa hTe) 树 Bn y er r 。其定义为 : a c e 二叉排 序树或者是空树 , 或者是满足如下性质 的二叉树 :
提供 大 量 的开 发 工具 和服 务 帮助开 发人员 开发基 于
计算和通信的各种应用。基 于这个特点 , 我们采用 C 来开发二叉排序树 图形显示系统 。 #
图 2 功能设计
甘
肃
科
技
n d . e t o e = tmp; oeLf d N e
第2 7卷
4 实现
数据结构二叉排序树

05
13
19
21
37
56
64
75
80
88
92
low mid high 因为r[mid].key<k,所以向右找,令low:=mid+1=4 (3) low=4;high=5;mid=(4+5) div 2=4
05
13
19
low
21
37
56
64
75
80
88
92
mid high
因为r[mid].key=k,查找成功,所查元素在表中的序号为mid 的值
平均查找长度:为确定某元素在表中某位置所进行的比 较次数的期望值。 在长度为n的表中找某一元素,查找成功的平均查找长度:
ASL=∑PiCi
Pi :为查找表中第i个元素的概率 Ci :为查到表中第i个元素时已经进行的比较次数
在顺序查找时, Ci取决于所查元素在表中的位置, Ci =i,设每个元素的查找概率相等,即Pi=1/n,则:
RL型的第一次旋转(顺时针) 以 53 为轴心,把 37 从 53 的左上转到 53 的左下,使得 53 的左 是 37 ;右是 90 ,原 53 的左变成了 37 的右。 RL型的第二次旋转(逆时针)
一般情况下,假设由于二叉排序树上插入结点而失去 平衡的最小子树的根结点指针为a(即a是离插入结点最 近,且平衡因子绝对值超过1的祖先结点),则失去平衡 后进行调整的规律可归纳为下列四种情况: ⒈RR型平衡旋转: a -2 b -1 h-1 a1
2.查找关键字k=85 的情况 (1) low=1;high=11;mid=(1+11) / 2=6
05
13
19
21
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用 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 动态可视遍历过程和算法的动态演示同步进行的实现 我们在设计动画时采用基于形状的动画。基于形状的动画也称为“子画面”动画,是更