91av视频/亚洲h视频/操亚洲美女/外国一级黄色毛片 - 国产三级三级三级三级

  • 大小: 40KB
    文件類型: .rar
    金幣: 2
    下載: 0 次
    發(fā)布日期: 2024-02-04
  • 語言: C/C++
  • 標簽: 二叉樹??

資源簡介

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


評論

共有 條評論

相關(guān)資源