资源简介
1本程序在vc++6.0编译通过并能正常运行。
2主界面
程序已经尽量做到操作简便了,用户只需要根据提示一步步进行操作就行了。
六思考和总结:
这个课程设计的各个基本操作大部分都在我的综合性实验中实现了,所以做这个主要攻克插入和删除这两个算法!其中插入在书本上已经有了,其中的右平衡算法虽然没有给出,但通过给出的左平衡算法很容易就可以写出右平衡算法。所以最终的点就在于删除算法的实现!做的过程中对插入算法进行了非常非常多次的尝试!花了非常多的时间,这其中很多时候是在对程序进行单步调试,运用了VC6。0的众多良好工具,也学到了很多它的许多好的调试手段。
其中删除算法中最难想到的一点是:在用叶子结点代替要删除的非叶子结点后,应该递归的运用删除算法去删除叶子结点!这就是整个算法的核心,其中很强烈得体会到的递归的强大,递归的最高境界(我暂时能看到的境界)!
其它的都没什么了。选做的那两个算法很容易实现的:
1合并两棵平衡二叉排序树:只需遍历其中的一棵,将它的每一个元素插入到另一棵即可。
2拆分两棵平衡二叉排序树:只需以根结点为中心,左子树独立为一棵,右子树独立为一棵,最后将根插入到左子树或右子树即可。
BSTreeEmpty(BSTree T)
初始条件:平衡二叉排序树存在。
操作结果:若T为空平衡二叉排序树,则返回TRUE,否则FALSE.
BSTreeDepth(BSTree T)
初始条件:平衡二叉排序树存在。
操作结果:返回T的深度。
LeafNum(BSTree T)
求叶子结点数,非递归中序遍历
NodeNum(BSTree T)
求结点数,非递归中序遍历
DestoryBSTree(BSTree *T)
后序遍历销毁平衡二叉排序树T
R_Rotate(BSTree *p)
对以*p为根的平衡二叉排序树作右旋处理,处理之后p指向新的树根结点
即旋转处理之前的左子树的根结点
L_Rotate(BSTree *p)
对以*p为根的平衡二叉排序树作左旋处理,处理之后p指向新的树根结点,
即旋转处理之前的右子树的根结点
LeftBalance(BSTree *T)
对以指针T所指结点为根的平衡二叉排序树作左平衡旋转处理,
本算法结束时,指针T指向新的根结点
RightBalance(BSTree *T)
对以指针T所指结点为根的平衡二叉排序树作右平衡旋转处理,
本算法结束时,指针T指向新的根结点
Insert_AVL(BSTree *T, TElemType e, int *taller)
若在平衡的二叉排序树T中不存在和e有相同的关键字的结点,
则插入一个数据元素为e的新结点,并返回OK,否则返回ERROR.
若因插入而使二叉排序树失去平衡,则作平衡旋转处理
布尔变量taller反映T长高与否
InOrderTraverse(BSTree T)
递归中序遍历输出平衡二叉排序树
SearchBST(BSTree T, TElemType e, BSTree *f, BSTree *p)
在根指针T所指的平衡二叉排序树中递归的查找其元素值等于e的数据元素,
若查找成功,则指针p指向该数据元素结点,并返回TRUE,否则指针p
指向查找路径上访问的最后一个结点并返回FALSE,指针f指向T的双亲,
其初始调用值为NULL
Delete_AVL(BSTree *T, TElemType e, int *shorter)
在平衡二叉排序树中删除元素值为e的结点,成功返回OK,失败返回ERROR
PrintBSTree_GList(BSTree T)
以广义表形式打印出来
PrintBSTree_AoList(BSTree T, int length)
以凹入表形式打印,length初始值为0
Combine_Two_AVL(BSTree *T1, BSTree T2)
合并两棵平衡二叉排序树
Split_AVL(BSTree T, BSTree *T1, BSTree *T2)
拆分两棵平衡二叉树
}
(2)存储结构的定义:
typedef struct BSTNode
{
TElemType data;
int bf; //结点的平衡因子
struct BSTNode *lchild, *rchild;//左.右孩子指针
}BSTNode, *BSTree;
代码片段和文件信息
#define MAX_NUM 100
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define Status int
#define LH 1 //左高
#define RH -1 //右高
#define EH 0 //等高
#define TETYPE “%c“
#define TElemType char
#include
#include
#include
#include
typedef struct BSTNode
{
TElemType data;
int bf; //结点的平衡因子
struct BSTNode *lchild *rchild;//左.右孩子指针
}BSTNode *BSTree;
//***********基本操作***************************************
void Visit(BSTree T)
{
printf(TETYPE T->data);
printf(“(%d)“ T->bf);
printf(“ “);
}
Status BSTreeEmpty(BSTree T)
//初始条件:平衡二叉排序树存在。
//操作结果:若T为空平衡二叉排序树,则返回TRUE否则FALSE.
{
return (T ? FALSE : TRUE);
}
int BSTreeDepth(BSTree T)
//初始条件:平衡二叉排序树存在。操作结果:返回T的深度。
{
int L_depthR_depth;
if(T==NULL)
return 0;
else
{
if(T->lchild)
L_depth = BSTreeDepth(T->lchild);
else
L_depth = 0;
if(T->rchild)
R_depth = BSTreeDepth(T->rchild);
else
R_depth=0;
return (L_depth >= R_depth ? L_depth : R_depth)+1;
}
}
int LeafNum(BSTree T)
//求叶子结点数,非递归中序遍历
{
BSTree s[MAX_NUM]; int i=0num=0; BSTree p;
if(T)
{
s[i++]=T;
while(i)
{
while((p=s[i-1])&&p)
s[i++]=p->lchild;
--i;//空指针出
if(i)
{
p=s[--i];
if(!p->lchild&&!p->rchild)
{
num++;
Visit(p);
putchar(‘ ‘);
}
s[i++]=p->rchild;
}
}
}
return num;
}
int NodeNum(BSTree T)
//求结点数,非递归中序遍历
{
BSTree s[MAX_NUM]; int i=0num=0; BSTree p;
if(T)
{
s[i++]=T;
while(i)
{
while((p=s[i-1])&&p)
s[i++]=p->lchild;
--i;//空指针出
if(i)
{
p=s[--i];
num++;
s[i++]=p->rchild;
}
}
}
return num;
}
void DestoryBSTree(BSTree *T)
//后序遍历销毁平衡二叉排序树T
{
if(*T)
{
if((*T)->lchild)
DestoryBSTree(&(*T)->lchild);
if((*T)->rchild)
DestoryBSTree(&(*T)->rchild);
free(*T);
*T = NULL;
}
}
void R_Rotate(BSTree *p)
{//对以*p为根的平衡二叉排序树作右旋处理,处理之后p指向新的树根结点
//即旋转处理之前的左子树的根结点
BSTree lc = NULL;
lc = (*p)->lchild; //lc指向*p的左子树根结点
(*p)->lchild = lc->rchild;//lc的右子树挂接为*p的左子树
lc->rchild = *p;
*p = lc; //p指向新的根结点
}
void L_Rotate(BSTree *p)
{//对以*p为根的平衡二叉排序树作左旋处理,处理之后p指向新的树根结点,
//即旋转处理之前的右子树的根结点
BSTree rc = NULL;
rc = (*p)->rchild; //rc指向*p的右子树根结点
(*p)->rchild = rc->lchild;//rc的左子树挂接为*p的右子树
rc->lchild = *p;
*p = rc; //p指向新的根结点
}
void LeftBalance(BSTree *T)
{//对以指针T所指结点为根的平衡二叉排序树作左平衡旋转处理,
//本算法结束时,指针T指向新的根结点
BSTree lc = NULL rd = NULL;
lc = (*T)->lchild; //lc指向*T的左子树的树根结点
switch(lc->bf) //检查*T的左子树的平衡度,并作相应的平衡处理
{
case LH: //新结点插入在*T的左孩子的左子树上,要作单右旋处理
(*T)->bf = lc->bf = EH;
R_Rotate(T);
break;
case RH: //新结点插入在*T的左孩子的右子树上,要作双旋处理
rd = lc->rchild; //rd指向*T的左孩子的右子树的根
switch(rd->bf) //根据其的平衡度,修改*T及其左孩子的平衡因子
{
case LH:
(*T)->bf = RH;
lc->bf = EH;
break;
case EH:
(*T)->bf = l
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 20360 2009-12-22 16:15 b.c
文件 188452 2009-12-22 16:10 b.exe
----------- --------- ---------- ----- ----
208812 2
- 上一篇:广东工业大学数据结构课程设计航空客运订票系统
- 下一篇:C++学生考试系统源码
相关资源
- 使用平衡二叉树管理的学生管理系统
- 家族成员信息管理系统
- 二叉树 VC6.0 MFC实现 数据结构
- 二叉树的建立以及遍历
- MFC二叉树遍历的可视化
- 二叉树的生成与遍历mfc
- 二叉树的前序中序后序遍历MFC
- MFC/VC二叉树的建立和显示画图形式显
- 二叉树的遍历及应用.ppt
- 用二叉树做的心理测试mfc
- 二叉树和森林之间的转换
- c++ mfc 单词及其释义的录入和读取,查
- 利用二叉树结构实现赫夫曼编/解码器
- 数据结构实验报告-实现二叉树的基本
- C语言判定一棵二叉树是否为二叉搜索
- 数据结构与算法课程设计---AVL TREE的实
- 二叉树C语言以及构建表达式树
- c语言遍历二叉树
- C++前中后缀表达式转表达式二叉树
- mfc二叉树的实现,涉及到增加节点等
- 二叉树非递归遍历源码
- 数据结构遍历二叉树算法C语言版(附
- C语言源代码学生成绩管理系统、图书
- C++ 二叉树 动物猜想游戏
- 学生成绩管理系统含二叉树内容
- 《数据结构》C语言版 实验报告 基础
- 二叉树c++源代码实现查找,删除,插
- 构建二叉树、输出二叉树、求树深、
- 孩子兄弟链表法表示二叉树C++
- 二叉树成绩管理系统
评论
共有 条评论