資源簡介
1本程序在vc++6.0編譯通過并能正常運行。
2主界面
程序已經(jīng)盡量做到操作簡便了,用戶只需要根據(jù)提示一步步進行操作就行了。
六思考和總結(jié):
這個課程設(shè)計的各個基本操作大部分都在我的綜合性實驗中實現(xiàn)了,所以做這個主要攻克插入和刪除這兩個算法!其中插入在書本上已經(jīng)有了,其中的右平衡算法雖然沒有給出,但通過給出的左平衡算法很容易就可以寫出右平衡算法。所以最終的點就在于刪除算法的實現(xiàn)!做的過程中對插入算法進行了非常非常多次的嘗試!花了非常多的時間,這其中很多時候是在對程序進行單步調(diào)試,運用了VC6。0的眾多良好工具,也學到了很多它的許多好的調(diào)試手段。
其中刪除算法中最難想到的一點是:在用葉子結(jié)點代替要刪除的非葉子結(jié)點后,應該遞歸的運用刪除算法去刪除葉子結(jié)點!這就是整個算法的核心,其中很強烈得體會到的遞歸的強大,遞歸的最高境界(我暫時能看到的境界)!
其它的都沒什么了。選做的那兩個算法很容易實現(xiàn)的:
1合并兩棵平衡二叉排序樹:只需遍歷其中的一棵,將它的每一個元素插入到另一棵即可。
2拆分兩棵平衡二叉排序樹:只需以根結(jié)點為中心,左子樹獨立為一棵,右子樹獨立為一棵,最后將根插入到左子樹或右子樹即可。
BSTreeEmpty(BSTree T)
初始條件:平衡二叉排序樹存在。
操作結(jié)果:若T為空平衡二叉排序樹,則返回TRUE,否則FALSE.
BSTreeDepth(BSTree T)
初始條件:平衡二叉排序樹存在。
操作結(jié)果:返回T的深度。
LeafNum(BSTree T)
求葉子結(jié)點數(shù),非遞歸中序遍歷
NodeNum(BSTree T)
求結(jié)點數(shù),非遞歸中序遍歷
DestoryBSTree(BSTree *T)
后序遍歷銷毀平衡二叉排序樹T
R_Rotate(BSTree *p)
對以*p為根的平衡二叉排序樹作右旋處理,處理之后p指向新的樹根結(jié)點
即旋轉(zhuǎn)處理之前的左子樹的根結(jié)點
L_Rotate(BSTree *p)
對以*p為根的平衡二叉排序樹作左旋處理,處理之后p指向新的樹根結(jié)點,
即旋轉(zhuǎn)處理之前的右子樹的根結(jié)點
LeftBalance(BSTree *T)
對以指針T所指結(jié)點為根的平衡二叉排序樹作左平衡旋轉(zhuǎn)處理,
本算法結(jié)束時,指針T指向新的根結(jié)點
RightBalance(BSTree *T)
對以指針T所指結(jié)點為根的平衡二叉排序樹作右平衡旋轉(zhuǎn)處理,
本算法結(jié)束時,指針T指向新的根結(jié)點
Insert_AVL(BSTree *T, TElemType e, int *taller)
若在平衡的二叉排序樹T中不存在和e有相同的關(guān)鍵字的結(jié)點,
則插入一個數(shù)據(jù)元素為e的新結(jié)點,并返回OK,否則返回ERROR.
若因插入而使二叉排序樹失去平衡,則作平衡旋轉(zhuǎn)處理
布爾變量taller反映T長高與否
InOrderTraverse(BSTree T)
遞歸中序遍歷輸出平衡二叉排序樹
SearchBST(BSTree T, TElemType e, BSTree *f, BSTree *p)
在根指針T所指的平衡二叉排序樹中遞歸的查找其元素值等于e的數(shù)據(jù)元素,
若查找成功,則指針p指向該數(shù)據(jù)元素結(jié)點,并返回TRUE,否則指針p
指向查找路徑上訪問的最后一個結(jié)點并返回FALSE,指針f指向T的雙親,
其初始調(diào)用值為NULL
Delete_AVL(BSTree *T, TElemType e, int *shorter)
在平衡二叉排序樹中刪除元素值為e的結(jié)點,成功返回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)存儲結(jié)構(gòu)的定義:
typedef struct BSTNode
{
TElemType data;
int bf; //結(jié)點的平衡因子
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;????????????????????//結(jié)點的平衡因子
struct?BSTNode?*lchild?*rchild;//左.右孩子指針
}BSTNode?*BSTree;
//***********基本操作***************************************
void?Visit(BSTree?T)
{
printf(TETYPE?T->data);
printf(“(%d)“?T->bf);
printf(“?“);
}
Status?BSTreeEmpty(BSTree?T)
//初始條件:平衡二叉排序樹存在。
//操作結(jié)果:若T為空平衡二叉排序樹,則返回TRUE否則FALSE.
{
return?(T???FALSE?:?TRUE);
}
int?BSTreeDepth(BSTree?T)
//初始條件:平衡二叉排序樹存在。操作結(jié)果:返回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)
//求葉子結(jié)點數(shù),非遞歸中序遍歷
{
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)
//求結(jié)點數(shù),非遞歸中序遍歷
{
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指向新的樹根結(jié)點
?//即旋轉(zhuǎn)處理之前的左子樹的根結(jié)點
BSTree?lc?=?NULL;
lc?=?(*p)->lchild;????????//lc指向*p的左子樹根結(jié)點
(*p)->lchild?=?lc->rchild;//lc的右子樹掛接為*p的左子樹
lc->rchild?=?*p;
*p?=?lc;????????????????//p指向新的根結(jié)點
}
void?L_Rotate(BSTree?*p)
{//對以*p為根的平衡二叉排序樹作左旋處理,處理之后p指向新的樹根結(jié)點,
?//即旋轉(zhuǎn)處理之前的右子樹的根結(jié)點
BSTree?rc?=?NULL;
rc?=?(*p)->rchild;????????//rc指向*p的右子樹根結(jié)點
(*p)->rchild?=?rc->lchild;//rc的左子樹掛接為*p的右子樹
rc->lchild?=?*p;????????
*p?=?rc;????????????????//p指向新的根結(jié)點
}
void?LeftBalance(BSTree?*T)
{//對以指針T所指結(jié)點為根的平衡二叉排序樹作左平衡旋轉(zhuǎn)處理,
?//本算法結(jié)束時,指針T指向新的根結(jié)點
BSTree?lc?=?NULL?rd?=?NULL;
lc?=?(*T)->lchild;???//lc指向*T的左子樹的樹根結(jié)點
switch(lc->bf)???????//檢查*T的左子樹的平衡度,并作相應的平衡處理
{
case?LH:?????????????//新結(jié)點插入在*T的左孩子的左子樹上,要作單右旋處理
(*T)->bf?=?lc->bf?=?EH;
R_Rotate(T);
break;
case?RH:?????????????//新結(jié)點插入在*T的左孩子的右子樹上,要作雙旋處理
rd?=?lc->rchild;?//rd指向*T的左孩子的右子樹的根
switch(rd->bf)???//根據(jù)其的平衡度,修改*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
評論
共有 條評論