久久99精品久久久久久琪琪,久久人人爽人人爽人人片亞洲,熟妇人妻无码中文字幕,亚洲精品无码久久久久久久

數據結構課程設計- 平衡二叉樹操作

時間:2019-05-12 07:24:21下載本文作者:會員上傳
簡介:寫寫幫文庫小編為你整理了多篇相關的《數據結構課程設計- 平衡二叉樹操作》,但愿對你工作學習有幫助,當然你在寫寫幫文庫還可以找到更多《數據結構課程設計- 平衡二叉樹操作》。

第一篇:數據結構課程設計- 平衡二叉樹操作

課 程 設 計 報 告

課程名稱 數據結構課程設計 題 目平衡二叉樹操作 指導教師 設計起止日 2010-5-16 學 院 計算機學院 專 業

軟件工程 學生姓名

班級/學號------------成 績 _________________

一. 需求分析

1、建立平衡二叉樹并進行創建、增加、刪除、調平等操作。

2、設計一個實現平衡二叉樹的程序,可進行創建、增加、刪除、調平等操作,實現動態的輸入數據,實時的輸出該樹結構。

3、測試數據:自選數據

二. 概要設計

平衡二叉樹是在構造二叉排序樹的過程中,每當插入一個新結點時,首先檢查是否因插入新結點而破壞了二叉排序樹的平衡性,若是,則找出其中的最小不平衡子樹,在保持二叉排序樹特性的前提下,調整最小不平衡子樹中各結點之間的鏈接關系,進行相應的旋轉,使之成為新的平衡子樹。具體步驟如下:

⑴ 每當插入一個新結點,從該結點開始向上計算各結點的平衡因子,即計算該結點的祖先結點的平衡因子,若該結點的祖先結點的平衡因子的絕對值均不超過1,則平衡二叉樹沒有失去平衡,繼續插入結點;

⑵ 若插入結點的某祖先結點的平衡因子的絕對值大于1,則找出其中最小不平衡子樹的根結點;

⑶ 判斷新插入的結點與最小不平衡子樹的根結點的關系,確定是哪種類型的調整;

⑷ 如果是LL型或RR型,只需應用扁擔原理旋轉一次,在旋轉過程中,如果出現沖突,應用旋轉優先原則調整沖突;如果是LR型或RL型,則需應用扁擔原理旋轉兩次,第一次最小不平衡子樹的根結點先不動,調整插入結點所在子樹,第二次再調整最小不平衡子樹,在旋轉過程中,如果出現沖突,應用旋轉優先原則調整沖突;

⑸ 計算調整后的平衡二叉樹中各結點的平衡因子,檢驗是否因為旋轉而破壞其他結點的平衡因子,以及調整后的平衡二叉樹中是否存在平衡因子大于1的結點。

三. 詳細設計

樹的內部變量

typedef struct BTNode { — 2 —

int data;int bf;//平衡因子 struct BTNode *lchild,*rchild;//左、右孩子

}BTNode,*BTree;調平二叉樹(左右調平方式大體雷同,之具體寫出其中一種調平方式)if(插入元素與當前根元素相等){ printf(“已存在相同關鍵字的結點n”);} if(插入元素小于當前根元素)){ if(插入新結點不成功)

return 0;if(插入成功)

switch(查看根的平衡因子)

{

case +1:

進行左平衡處理;

{

檢查*T的左子樹的平衡度,并作相應平衡處理

{

case +1:

令根及其左孩子的平衡因子為0;

做右平衡處理;

{

BTree lc;

lc指向的結點左子樹根結點;

rc的右子樹掛接為結點的左子樹;

lc的右孩子為原結點;

原結點指向新的結點lc;

}

break;

case-1:

rd指向*T的左孩子的右子樹根

switch(查看右孩子平衡因子)

{

case +1:

根的平衡因子為-1;

根左孩子的平衡因子為0;

break;

case 0:

令根和根左孩子的平衡因子為0;

break;

case-1:

}

}

}

}

根平衡因子為0;根左孩子平衡因子為1;break;

根右孩子的平衡因子為0;對*T的左子樹作左旋平衡處理;對*T作右旋平衡處理;break;令根的平衡因子為+1;break;令根的平衡因子為-1;break;case 0:

case-1:

四.調試分析

在進行對插入新結點并調平時由于利用的是普通的插入方法進行LL、LR、RL、RR型的轉換,使得在調試時經常沒有更改內部變量的值,導致編譯出錯。

對于在空樹情況下刪除結點的考慮,是在后期的調試檢驗過程中發現的。在沒有更改代碼前,如果按此操作,程序就會崩潰。原因就是在刪除函數中雖然考慮到了空樹的情況,但是在輸出樹的函數中沒有加入空樹的考慮而只是在創建樹函數中加入了if…else…的判斷。經過反復的檢查,發現可以直接在輸出函數中加入判斷而不必再其他位置判斷,并且調試成功。

五.使用說明和測試結果

測試數據:

創建二叉樹

— 4 —

增加二叉樹

直接創建平衡二叉樹

平衡二叉樹加入新節點并調平

刪除結點

— 6 —

六.心得體會

了解了建立樹的方法;

學會了利用二分法建立樹結構。、; 學習到了二叉樹的調平方法;

學會了向一個已知樹插入或刪除結點的方法。七.附錄 源代碼

#include “stdafx.h” #include #include #define EQ(a,b)((a)==(b))#define LT(a,b)((a)<(b))#define LQ(a,b)((a)>(b))#define LH +1 //左高 #define EH 0 //等高 #define RH-1 //右高 typedef struct BTNode { int data;int bf;//平衡因子 struct BTNode *lchild,*rchild;//左、右孩子

}BTNode,*BTree;

/*需要的函數聲明*/ void Right_Balance(BTree &p);void Left_Balance(BTree &p);void Left_Root_Balance(BTree &T);void Right_Root_Balance(BTree &T);bool InsertAVL(BTree &T,int i,bool &taller);void PrintBT(BTree T,int m);void CreatBT(BTree &T);void Left_Root_Balance_det(BTree &p,int &shorter);void Right_Root_Balance_det(BTree &p,int &shorter);void Delete(BTree q,BTree &r,int &shorter);int DeleteAVL(BTree &p,int x,int &shorter);void Adj_balance(BTree &T);bool SetAVL(BTree &T,int i,bool &taller);bool Insert_Balance_AVL(BTree &T,int i,bool &taller);/*主函數*/ void main(){

int input,search,m;bool taller=false;int shorter=0;BTree T;T=(BTree)malloc(sizeof(BTNode));T=NULL;while(1){

printf(“n請選擇需要的二叉樹操作n”);printf(“1.創建二叉樹2.增加新結點3.直接創建平衡二叉樹4.在平衡二叉樹上增加新結點并調平衡5.scanf(”%d“,&input);getchar();switch(input){ case 1:

CreatBT(T);break;printf(”請輸入你要增加的關鍵字“);scanf(”%d“,&search);getchar();InsertAVL(T,search,taller);m = 0;PrintBT(T,m);break;Adj_balance(T);刪除0.退出n”);case 2: case 3: — 8 —

break;

case 4:

printf(“請輸入你要增加的關鍵字”);

scanf(“%d”,&search);

getchar();

SetAVL(T,search,taller);

m = 0;

PrintBT(T,m);

break;

case 5:

printf(“請輸入你要刪除的關鍵字”);

scanf(“%d”,&search);

getchar();

DeleteAVL(T,search,shorter);

m=0;

PrintBT(T,m);

break;

case 0:

break;

default:

printf(“輸入錯誤,請重新選擇。”);

break;

}

if(input == 0)

break;

printf(“按任意鍵繼續.”);

getchar();} } /*對以*p為根的二叉排序樹作右旋處理*/ void Right_Balance(BTree &p){ BTree lc;lc = p->lchild;//lc指向的*p左子樹根結點

p->lchild = lc->rchild;//rc的右子樹掛接為*p的左子樹 lc->rchild = p;p = lc;//p指向新的結點

} /*對以*p為根的二叉排序樹作左旋處理*/ void Left_Balance(BTree &p){ BTree rc;rc = p->rchild;//指向的*p右子樹根結點

p->rchild = rc->lchild;//rc左子樹掛接到*p的右子樹

rc->lchild = p;p = rc;//p指向新的結點

— 9 — } /*對以指針T所指結點為根的二叉樹作左平衡旋轉處理*/ void Left_Root_Balance(BTree &T){

} /*對以指針T所指結點為根的二叉樹作右平衡旋轉處理*/ void Right_Root_Balance(BTree &T){

BTree rc,ld;rc = T->rchild;//指向*T的左子樹根結點

switch(rc->bf)//檢查*T的右子樹的平衡度,并作相應平衡處理 { case RH: //新結點插入在*T的右孩子的右子樹上,要作單左旋處理

T->bf = rc->bf =EH;Left_Balance(T);break;ld = rc->lchild;//ld指向*T的右孩子的左子樹根 switch(ld->bf)//修改*T及其右孩子的平衡因子 BTree lc,rd;lc = T->lchild;//指向*T的左子樹根結點

switch(lc->bf)//檢查*T的左子樹的平衡度,并作相應平衡處理 { case LH: //新結點插入在*T的左孩子的左子樹上,要作單右旋處理

} T->bf = lc->bf = EH;Right_Balance(T);break;rd = lc->rchild;//rd指向*T的左孩子的右子樹根 switch(rd->bf)//修改*T及其左孩子的平衡因子 { case LH:

} rd->bf = EH;Left_Balance(T->lchild);//對*T的左子樹作左旋平衡處理 Right_Balance(T);//對*T作右旋平衡處理 T->bf = RH;lc->bf = EH;break;T->bf = lc->bf = EH;break;T->bf = EH;lc->bf = LH;break;case RH: //新結點插入在*T的左孩子的右子樹上,要作雙旋處理

case EH: case RH: case LH: //新結點插入在*T的右孩子的左子樹上,要作雙旋處理

— 10 —

}

} { case LH:

} ld->bf = EH;Right_Balance(T->rchild);//對*T的右子樹作左旋平衡處理 Left_Balance(T);//對*T作左旋平衡處理 T->bf = EH;rc->bf = RH;break;T->bf = rc->bf =EH;break;T->bf = LH;rc->bf = EH;break;case EH: case RH: /*插入結點i,若T中存在和i相同關鍵字的結點,則插入一個數據元素為i的新結點,并返回1,否則返回0*/ bool InsertAVL(BTree &T,int i,bool &taller){

if(!T)//插入新結點,樹“長高”,置taller為true {

} else {

if(EQ(i,T->data))//樹中已存在和有相同關鍵字的結點 {

} if(LT(i,T->data))//應繼續在*T的左子樹中進行搜索 taller = false;printf(“已存在相同關鍵字的結點n”);return 0;T =(BTree)malloc(sizeof(BTNode));T->data = i;T->lchild = T->rchild =NULL;T->bf = EH;taller = true;{ if(!InsertAVL(T->lchild,i,taller))return 0;} else //應繼續在*T的右子樹中進行搜索 { if(!InsertAVL(T->rchild,i,taller))return 0;

— 11 — } } return 1;} /*按樹狀打印輸出二叉樹的元素,m表示結點所在層次*/ void PrintBT(BTree T,int m){

} /*創建二叉樹,以輸入-32767為建立的結束*/ void CreatBT(BTree &T){

} int m;int i;bool taller=false;T = NULL;printf(“n請輸入關鍵字(以-32767結束建立二叉樹):”);scanf(“%i”,&i);getchar();while(i!=-32767){

} m=0;printf(“您創建的二叉樹為:n”);PrintBT(T,m);InsertAVL(T,i,taller);printf(“n請輸入關鍵字(以-32767結束建立二叉樹):”);scanf(“%i”,&i);getchar();taller=false;if(T){

} else {

} printf(“這是一棵空樹!n”);getchar();int i;if(T->rchild)PrintBT(T->rchild,m+1);printf(“ ”);//打印i 個空格以表示出層次 for(i = 1;i<=m;i++)printf(“%dn”,T->data);//打印T 元素,換行 if(T->lchild)PrintBT(T->lchild,m+1);— 12 — /*刪除結點時左平衡旋轉處理*/ void Left_Root_Balance_det(BTree &p,int &shorter){

BTree p1,p2;if(p->bf==1)//p結點的左子樹高,刪除結點后p的bf減,樹變矮 {

} else if(p->bf==0)//p結點左、右子樹等高,刪除結點后p的bf減,樹高不變 {

} else //p結點的右子樹高 {

p1=p->rchild;//p1指向p的右子樹

if(p1->bf==0)//p1結點左、右子樹等高,刪除結點后p的bf為-2,進行左旋處理,樹高不變 {

} else if(p1->bf==-1)//p1的右子樹高,左旋處理后,樹變矮 {

} else //p1的左子樹高,進行雙旋處理(先右旋后左旋),樹變矮 {

p2=p1->lchild;p1->lchild=p2->rchild;p2->rchild=p1;p->rchild=p2->lchild;p2->lchild=p;if(p2->bf==0){

} else if(p2->bf==-1){ p->bf=1;p1->bf=0;p->bf=0;p1->bf=0;Left_Balance(p);p1->bf=p->bf=0;shorter=1;Left_Balance(p);p1->bf=1;p->bf=-1;shorter=0;p->bf=-1;shorter=0;p->bf=0;shorter=1;

}

}

} } else {

} p2->bf=0;p=p2;shorter=1;p->bf=0;p1->bf=-1;/*刪除結點時右平衡旋轉處理*/ void Right_Root_Balance_det(BTree &p,int &shorter){

BTree p1,p2;if(p->bf==-1){

} else if(p->bf==0){

} else {

p1=p->lchild;if(p1->bf==0){

} else if(p1->bf==1){

} else { p2=p1->rchild;Right_Balance(p);p1->bf=p->bf=0;shorter=1;Right_Balance(p);p1->bf=-1;p->bf=1;shorter=0;p->bf=1;shorter=0;p->bf=0;shorter=1;— 14 —

p1->rchild=p2->lchild;

p2->lchild=p1;

p->lchild=p2->rchild;

p2->rchild=p;

if(p2->bf==0)

{

p->bf=0;

p1->bf=0;

}

else if(p2->bf==1)

{

p->bf=-1;

p1->bf=0;

}

else

{

p->bf=0;

p1->bf=1;

}

p2->bf=0;

p=p2;

shorter=1;

} } } /*刪除結點*/ void Delete(BTree q,BTree &r,int &shorter){ if(r->rchild==NULL){

q->data=r->data;

q=r;

r=r->lchild;

free(q);

shorter=1;} else {

Delete(q,r->rchild,shorter);

if(shorter==1)

Right_Root_Balance_det(r,shorter);} } /*二叉樹的刪除操作*/ int DeleteAVL(BTree &p,int x,int &shorter){

} int k;BTree q;if(p==NULL){

} else if(x

data)//在p的左子樹中進行刪除 {

} else if(x>p->data)//在p的右子樹中進行刪除 {

} else {

} q=p;if(p->rchild==NULL)//右子樹空則只需重接它的左子樹 {

} else if(p->lchild==NULL)//左子樹空則只需重接它的右子樹 {

} else//左右子樹均不空 {

} return 1;Delete(q,q->lchild,shorter);if(shorter==1)Left_Root_Balance_det(p,shorter);p=q;p=p->rchild;free(q);shorter=1;p=p->lchild;free(q);shorter=1;k=DeleteAVL(p->rchild,x,shorter);if(shorter==1)Right_Root_Balance_det(p,shorter);return k;k=DeleteAVL(p->lchild,x,shorter);if(shorter==1)Left_Root_Balance_det(p,shorter);return k;printf(“不存在要刪除的關鍵字!n”);return 0;— 16 — /*二叉樹調平操作*/ void Adj_balance(BTree &T){ int m;int i;bool taller=false;T = NULL;printf(“n請輸入關鍵字(以-32767結束建立平衡二叉樹):”);scanf(“%d”,&i);getchar();while(i!=-32767){

SetAVL(T,i,taller);

printf(“n請輸入關鍵字(以-32767結束建立平衡二叉樹):”);

scanf(“%d”,&i);

getchar();

taller=false;} m=0;printf(“平衡二叉樹創建結束.n”);if(T)

PrintBT(T,m);else

printf(“這是一棵空樹.n”);} /*調平二叉樹具體方法*/ bool SetAVL(BTree &T,int i,bool &taller){ if(!T)//插入新結點,樹“長高”,置taller為true {

T =(BTree)malloc(sizeof(BTNode));

T->data = i;

T->lchild = T->rchild =NULL;

T->bf = EH;

taller = true;} else {

if(EQ(i,T->data))//樹中已存在和有相同關鍵字的結點

{

taller = false;

printf(“已存在相同關鍵字的結點n”);

return 0;

}

if(LT(i,T->data))//應繼續在*T的左子樹中進行搜索 {

}

}

} if(!SetAVL(T->lchild,i,taller))

{

} case LH: //原本左子樹比右子樹高,需要作左平衡處理

Left_Root_Balance(T);taller = false;break;T->bf = LH;taller = true;break;T->bf = EH;taller = false;break;return 0;switch(T->bf)//檢查*T的平衡度 if(taller)//已插入到*T的左子樹中且左子樹“長高”

case EH: //原本左子樹、右子等高,現因左子樹增高而使樹增高

case RH: //原本右子樹比左子樹高,現左、右子樹等高

else //應繼續在*T的右子樹中進行搜索 {

} return 1;if(!SetAVL(T->rchild,i,taller))

{

} case LH: //原本左子樹比右子樹高,現左、右子樹等高

T->bf = EH;taller = false;break;T->bf = RH;taller = true;break;Right_Root_Balance(T);taller = false;break;return 0;switch(T->bf)//檢查*T的平衡度 if(taller)//已插入到*T的右子樹中且右子樹“長高”

case EH: //原本左子樹、右子等高,現因右子樹增高而使樹增高

case RH: //原本右子樹比左子樹高,需要作右平衡處理

— 18 —

第二篇:數據結構課程設計-_平衡二叉樹操作 - 副本

課 程 設 計 報 告

一. 需求分析

1、建立平衡二叉樹并進行創建、增加、刪除、調平等操作。

2、設計一個實現平衡二叉樹的程序,可進行創建、增加、刪除、調平等操作,實現動態的輸入數據,實時的輸出該樹結構。

3、測試數據:自選數據

二. 概要設計

平衡二叉樹是在構造二叉排序樹的過程中,每當插入一個新結點時,首先檢查是否因插入新結點而破壞了二叉排序樹的平衡性,若是,則找出其中的最小不平衡子樹,在保持二叉排序樹特性的前提下,調整最小不平衡子樹中各結點之間的鏈接關系,進行相應的旋轉,使之成為新的平衡子樹。具體步驟如下:

⑴ 每當插入一個新結點,從該結點開始向上計算各結點的平衡因子,即計算該結點的祖先結點的平衡因子,若該結點的祖先結點的平衡因子的絕對值均不超過1,則平衡二叉樹沒有失去平衡,繼續插入結點;

⑵ 若插入結點的某祖先結點的平衡因子的絕對值大于1,則找出其中最小不平衡子樹的根結點;

⑶ 判斷新插入的結點與最小不平衡子樹的根結點的關系,確定是哪種類型的調整;

⑷ 如果是LL型或RR型,只需應用扁擔原理旋轉一次,在旋轉過程中,如果出現沖突,應用旋轉優先原則調整沖突;如果是LR型或RL型,則需應用扁擔原理旋轉兩次,第一次最小不平衡子樹的根結點先不動,調整插入結點所在子樹,第二次再調整最小不平衡子樹,在旋轉過程中,如果出現沖突,應用旋轉優先原則調整沖突;

⑸ 計算調整后的平衡二叉樹中各結點的平衡因子,檢驗是否因為旋轉而破壞其他結點的平衡因子,以及調整后的平衡二叉樹中是否存在平衡因子大于1的結點。

三. 詳細設計

樹的內部變量

— 1 — typedef struct BTNode {

int data;int bf;//平衡因子 struct BTNode *lchild,*rchild;//左、右孩子

}BTNode,*BTree;調平二叉樹(左右調平方式大體雷同,之具體寫出其中一種調平方式)if(插入元素與當前根元素相等){ printf(“已存在相同關鍵字的結點n”);} if(插入元素小于當前根元素)){ if(插入新結點不成功)

return 0;if(插入成功)

switch(查看根的平衡因子)

{

case +1:

進行左平衡處理;

{

檢查*T的左子樹的平衡度,并作相應平衡處理

{

case +1:

令根及其左孩子的平衡因子為0;

做右平衡處理;

{

BTree lc;

lc指向的結點左子樹根結點;

rc的右子樹掛接為結點的左子樹;

lc的右孩子為原結點;

原結點指向新的結點lc;

}

break;

case-1:

rd指向*T的左孩子的右子樹根

switch(查看右孩子平衡因子)

{

case +1:

根的平衡因子為-1;

根左孩子的平衡因子為0;

break;

case 0:

令根和根左孩子的平衡因子為0;— 2 —

}

}

}

}

break;根平衡因子為0;根左孩子平衡因子為1;break;

case-1:

根右孩子的平衡因子為0;對*T的左子樹作左旋平衡處理;對*T作右旋平衡處理;break;令根的平衡因子為+1;break;令根的平衡因子為-1;break;case 0:

case-1:

四.調試分析

在進行對插入新結點并調平時由于利用的是普通的插入方法進行LL、LR、RL、RR型的轉換,使得在調試時經常沒有更改內部變量的值,導致編譯出錯。

對于在空樹情況下刪除結點的考慮,是在后期的調試檢驗過程中發現的。在沒有更改代碼前,如果按此操作,程序就會崩潰。原因就是在刪除函數中雖然考慮到了空樹的情況,但是在輸出樹的函數中沒有加入空樹的考慮而只是在創建樹函數中加入了if…else…的判斷。經過反復的檢查,發現可以直接在輸出函數中加入判斷而不必再其他位置判斷,并且調試成功。

五.使用說明和測試結果

測試數據:

創建二叉樹

增加二叉樹

直接創建平衡二叉樹

— 4 —平衡二叉樹加入新節點并調平

刪除結點

六.心得體會

了解了建立樹的方法;

學會了利用二分法建立樹結構。、; 學習到了二叉樹的調平方法;

學會了向一個已知樹插入或刪除結點的方法。

— 6 —

第三篇:數據結構課程設計二叉樹平衡的判定

數據結構與算法 課程設計報告

課程設計題目: 二叉樹平衡的判定

專業班級: 信息與計算科學1001班 姓 名: 謝煒 學 號:100701114 設計室號: 理學院機房 設計時間: 2011-12-26 批閱時間: 指導教師: 杜洪波 成 績:

一、摘要:

基于我們對C語言和數據結構的學習我們有能力編寫處理一些比較基本而又簡單的問題。在我們此題我們的目標就是任意給出一個二叉樹我們判斷是否為平衡的二叉樹。

我們在學習計算機語言類的知識時當然要注重理論知識的學習,但是我們要明確我們學習的是計算機語言,由于課程的性質就決定了我們必須將我們在課本中學到的知識在計算機上運行并且自己能編寫一些比較簡單的程序,這才是我們學習計算機語言的最終目的而不是滿足于理解一個理論會算一個題。因而我們將要抓住這樣一個鍛煉的機會

所謂平衡二叉樹,它或者是一顆空樹或者是具有下列性質的二叉樹:它的左右子樹都是平衡二叉樹,且左右子樹的深度之差得絕對值不超過1。

在我們這個判定任意給定的二叉樹的題中。我們處理這道題的主要的思路是:首先按先序和中序或者按中序和后序的方式將我們所要判斷的二叉樹輸入進入,目的是要得到一個明確的二叉樹的結構準確的判斷二叉樹是否平衡。在我們判斷二叉樹的平衡中我們將分別考慮二叉樹左右子樹的是不是為平衡二叉樹,依次得到左右子樹的深度,判斷左右子樹的平衡性。

在我們的設計思路中我們將用到不同的樹的遍歷方式。

二、問題重敘:

平衡二叉樹的判斷,設計要求給定一個先序或者后序的遍歷結果,判斷其是否為二叉樹。問題分析:

在處理二叉樹平衡的判斷的問題中。我們需要將分別考慮二叉樹的左右子樹的平衡問題只要左右子樹確定為平衡二叉樹,而且左右子樹的深度的絕對值之差不大于1,那么我們得到的就是一顆平衡的二叉樹。

我們將先通過前序和中序或者中序和后序將所要判斷的二叉樹輸入。建立一個明確的二叉樹在此基礎上判斷二叉樹是否為平衡二叉樹。

我們先建立一個二叉樹并用前序和中序或者中序和后序遍歷的方式將我們輸入的樹的元素輸入得到一個明確的樹的結構。

三、流程圖如下:

四、模塊分析:

1、定義一個結構體存儲各節點的信息,并且用遞歸的方法存儲左右子樹的信息

typedef struct BINTREE { char

chData;struct BINTREE * pbLChild;struct BINTREE * pbRChild;} BinTree, * pBinTree;

2、分別得到樹的深度以及左右子樹的深度

int BT_GetTreeDepth(pBinTree pbTree){ //存儲樹總的深度

int iDepthTotal = 0;//存儲左子樹的深度

int iDepthLeft = 0;//存儲右子樹的深度

int iDepthRight = 0;

if(pbTree == NULL){

iDepthTotal = 0;} else {

// 左孩子的深度

iDepthLeft = BT_GetTreeDepth(pbTree->pbLChild);

// 右孩子的深度

iDepthRight = BT_GetTreeDepth(pbTree->pbRChild);

// 去左右孩子深度的最大值,1代表著根節點

iDepthTotal = 1 +(iDepthLeft > iDepthRight ? iDepthLeft : iDepthRight);} return iDepthTotal;}

3、判斷左右子樹是不是為平衡二叉樹

bool BT_IsBalanceTree(pBinTree pbTree){ //如果樹不是空的if(pbTree!= NULL){

//存儲左孩子的深度

int iLeftDepth = 0;

//存儲右孩子的深度

int iRightDepth = 0;

//得到左孩子的深度

iLeftDepth = BT_GetTreeDepth(pbTree->pbLChild);

//得到右孩子的深度

iRightDepth = BT_GetTreeDepth(pbTree->pbRChild);

//判斷樹是不是平衡二叉樹

平衡二叉樹的左右孩子的深度絕對值只差不大于

if((iLeftDepthiRightDepth <= 1))

{

// 判斷左子樹是不是平衡的

BT_IsBalanceTree(pbTree->pbLChild);

//判斷右子樹是不是平衡的

BT_IsBalanceTree(pbTree->pbRChild);

}

else

{

return false;

} } else {

return false;}

return true;}

4、輸入各節點元素

bool BT_PreInToTree(pBinTree & pbTree, char * szInOrder, char * szPreOrder, int iInLeft, int iInRight, int iPreLeft, int iPreRight)

BT_PreInToTree(pbTree->pbLChild, szInOrder, szPreOrder, iInLeft, iCurPosiRightDepth >=-1)&&(iLeftDepthiInLeft;// If current position is greater than left, generate left child if(iCurPos > iInLeft){ BT_PreInToTree(pbTree->pbLChild, szInOrder, szPreOrder, iInLeft, iCurPosiInLeft;// If the current position is greater than the left border, generate the left child if(iCurPos > iInLeft){

BT_InPostToTree(pbTree->pbLChild, szInOrder, szPostOrder, iInLeft, iCurPos1);}

// If the current position is less than the right border, generate the right child if(iCurPos < iInRight){

BT_InPostToTree(pbTree->pbRChild, szInOrder, szPostOrder, iCurPos + 1, iInRight, iPostLeft + iLengthLeft, iPostRight-1);} return true;} void BT_PreOrder(pBinTree pbTree){ if(pbTree!= NULL){

// The preorder traversal is, root, left child, right child

printf(“%c ”, pbTree->chData);

BT_PreOrder(pbTree->pbLChild);

BT_PreOrder(pbTree->pbRChild);} } void BT_PostOrder(pBinTree pbTree){

if(pbTree!= NULL){

// The postorder traversal is, left child, right child, root

BT_PostOrder(pbTree->pbLChild);

BT_PostOrder(pbTree->pbRChild);

printf(“%c ”, pbTree->chData);} } void main(){ char szPre [100] = “";char szMid [100] = ”“;char szPost [100] = ”“;pBinTree pbPreInTree;pBinTree pbPostInTree;int

iMode = 0;printf(”請選擇生成二叉樹規則:前序和中序(0),后序和中序(1)n“);scanf(”%d“,&iMode);switch(iMode){ case 0:

{

printf(”請輸入前序序列:n“);

scanf(”%s“,&szPre);printf(”請輸入中序序列:n“);

scanf(”%s“,&szMid);bool bCorrect = BT_PreInToTree(pbPreInTree, szMid, szPre, 0, strlen(szMid)-1, 0, strlen(szPre)-1);

if(bCorrect)

{printf(”該樹的后序序列為:n“);

BT_PostOrder(pbPreInTree);

if(BT_IsBalanceTree(pbPreInTree))

{printf(”該樹是平衡二叉樹“);

}

else

{printf(”這個不是平衡二叉樹“);

}

}

else

{printf(”不要亂輸,前序與中序不匹配“);} }

break;case 1:

{printf(”請輸入中序序列:n“);scanf(”%s“,&szMid);printf(”請輸入后序序列:n“);scanf(”%s“,&szPost);bool bCorrect = BT_InPostToTree(pbPostInTree, szMid, szPost, 0, strlen(szMid)-1, 0, strlen(szPost)-1);

if(bCorrect)

{printf(”該樹的前序序列為:n“);BT_PreOrder(pbPostInTree);

if(BT_IsBalanceTree(pbPostInTree))

{printf(”該樹是平衡二叉樹“);

}

else

{printf(”這個不是平衡二叉樹“);

}

}

else

{printf(”不要亂輸,中序與后序不匹配“);

} }

break;default:

{printf(”不要亂選,不支持其他模式");

} } }

第四篇:數據結構平衡二叉樹的操作演示

平衡二叉樹操作的演示

1.需求分析

本程序是利用平衡二叉樹,實現動態查找表的基本功能:創建表,查找、插入、刪除。具體功能:

(1)初始,平衡二叉樹為空樹,操作界面給出創建、查找、插入、刪除、合并、分裂六種操作供選擇。每種操作均提示輸入關鍵字。每次插入或刪除一個結點后,更新平衡二叉樹的顯示。

(2)平衡二叉樹的顯示采用凹入表現形式。(3)合并兩棵平衡二叉樹。

(4)把一棵二叉樹分裂為兩棵平衡二叉樹,使得在一棵樹中的所有關鍵字都小于或等于x,另一棵樹中的任一關鍵字都大于x。

如下圖:

2.概要設計

平衡二叉樹是在構造二叉排序樹的過程中,每當插入一個新結點時,首先檢查是否因插入新結點而破壞了二叉排序樹的平衡性,若是則找出其中的最小不平衡子樹,在保持二叉排序樹特性的前提下,調整最小不平衡子樹中各結點之間的鏈接關系,進行相應的旋轉,使之成為新的平衡子樹。具體步驟:

(1)每當插入一個新結點,從該結點開始向上計算各結點的平衡因子,即計算該結點的祖先結點的平衡因子,若該結點的祖先結點的平衡因子的絕對值不超過1,則平衡二叉樹沒有失去平衡,繼續插入結點;

(2)若插入結點的某祖先結點的平衡因子的絕對值大于1,則找出其中最小不平衡子樹的根結點;

(3)判斷新插入的結點與最小不平衡子樹的根結點個關系,確定是那種類型的調整;(4)如果是LL型或RR型,只需應用扁擔原理旋轉一次,在旋轉過程中,如果出現沖突,應用旋轉優先原則調整沖突;如果是LR型或RL型,則需應用扁擔原理旋轉兩次,第一次最小不平衡子樹的根結點先不動,調整插入結點所在子樹,第二次再調整最小不平衡子樹,在旋轉過程中,如果出現沖突,應用旋轉優先原則調整沖突;

(5)計算調整后的平衡二叉樹中各結點的平衡因子,檢驗是否因為旋轉而破壞其他結點的平衡因子,以及調整后平衡二叉樹中是否存在平衡因子大于1的結點。流程圖

3.詳細設計

二叉樹類型定義: typedefint Status;typedefintElemType;typedefstructBSTNode{

ElemType data;

int bf;

structBSTNode *lchild ,*rchild;} BSTNode,* BSTree;

Status SearchBST(BSTreeT,ElemType e)//查找 void R_Rotate(BSTree&p)//右旋 void L_Rotate(BSTree&p)//左旋

void LeftBalance(BSTree&T)//插入平衡調整 void RightBalance(BSTree&T)//插入平衡調整

Status InsertAVL(BSTree&T,ElemTypee,int&taller)//插入 void DELeftBalance(BSTree&T)//刪除平衡調整 void DERightBalance(BSTree&T)//刪除平衡調整 Status Delete(BSTree&T,int&shorter)//刪除操作

Status DeleteAVL(BSTree&T,ElemTypee,int&shorter)//刪除操作 void merge(BSTree&T1,BSTree &T2)//合并操作

void splitBSTree(BSTreeT,ElemTypee,BSTree&T1,BSTree &T2)//分裂操作 void PrintBSTree(BSTree&T,intlev)//凹入表顯示

附錄

源代碼:

#include #include //#define TRUE 1 //#define FALSE 0 //#define OK 1 //#define ERROR 0 #define LH +1 #define EH 0 #define RH-1 //二叉類型樹的類型定義 typedefint Status;typedefintElemType;typedefstructBSTNode{ ElemType data;int bf;//結點的平衡因子

structBSTNode *lchild ,*rchild;//左、右孩子指針 } BSTNode,* BSTree;/* 查找算法 */ Status SearchBST(BSTreeT,ElemType e){ if(!T){ return 0;//查找失敗 } else if(e == T->data){ return 1;//查找成功 } else if(e < T->data){ returnSearchBST(T->lchild,e);} else{ returnSearchBST(T->rchild,e);} }

//右旋

voidR_Rotate(BSTree&p){ BSTreelc;//處理之前的左子樹根結點

lc = p->lchild;//lc指向的*p的左子樹根結點

p->lchild = lc->rchild;//lc的右子樹掛接為*P的左子樹 lc->rchild = p;p = lc;//p指向新的根結點

} //左旋

voidL_Rotate(BSTree&p){ BSTreerc;rc = p->rchild;//rc指向的*p的右子樹根結點

p->rchild = rc->lchild;//rc的左子樹掛接為*p的右子樹 rc->lchild = p;p = rc;//p指向新的根結點 } //對以指針T所指結點為根結點的二叉樹作左平衡旋轉處理,//本算法結束時指針T指向新的根結點 voidLeftBalance(BSTree&T){ BSTreelc,rd;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=lc->bf=EH;break;case RH: T->bf=EH;lc->bf=LH;break;} rd->bf=EH;L_Rotate(T->lchild);//對*T的左子樹作左旋平衡處理 R_Rotate(T);//對*T作右旋平衡處理 } } //右平衡旋轉處理

voidRightBalance(BSTree&T){ BSTreerc,ld;rc=T->rchild;switch(rc->bf){ case RH: T->bf= rc->bf=EH;L_Rotate(T);break;case LH: ld=rc->lchild;switch(ld->bf){ case LH: T->bf=RH;rc->bf=EH;break;case EH: T->bf=rc->bf=EH;break;case RH: T->bf = EH;rc->bf=LH;break;} ld->bf=EH;R_Rotate(T->rchild);L_Rotate(T);} } //插入結點

Status InsertAVL(BSTree&T,ElemTypee,int&taller){//taller反應T長高與否 if(!T){//插入新結點,樹長高,置taller為true T=(BSTree)malloc(sizeof(BSTNode));T->data = e;T->lchild = T->rchild = NULL;T->bf = EH;taller = 1;} else{ if(e == T->data){ taller = 0;return 0;} if(e < T->data){ if(!InsertAVL(T->lchild,e,taller))//未插入 return 0;if(taller)//已插入到*T的左子樹中且左子樹長高

switch(T->bf){//檢查*T的平衡度,作相應的平衡處理 case LH: LeftBalance(T);taller = 0;break;case EH: T->bf = LH;taller = 1;break;case RH: T->bf = EH;taller = 0;break;} } else{ if(!InsertAVL(T->rchild,e,taller)){ return 0;} if(taller)//插入到*T的右子樹且右子樹增高 switch(T->bf){//檢查*T的平衡度 case LH: T->bf = EH;taller = 0;break;case EH: T->bf = RH;taller = 1;break;case RH: RightBalance(T);taller = 0;break;} } } return 1;}

void DELeftBalance(BSTree&T){//刪除平衡調整 BSTreelc,rd;lc=T->lchild;switch(lc->bf){ case LH: T->bf = EH;//lc->bf= EH;R_Rotate(T);break;case EH: T->bf = EH;lc->bf= EH;R_Rotate(T);break;case RH: rd=lc->rchild;switch(rd->bf){ case LH: T->bf=RH;lc->bf=EH;break;case EH: T->bf=lc->bf=EH;break;case RH: T->bf=EH;lc->bf=LH;break;} rd->bf=EH;L_Rotate(T->lchild);R_Rotate(T);} }

void DERightBalance(BSTree&T)//刪除平衡調整 { BSTreerc,ld;rc=T->rchild;switch(rc->bf){ case RH: T->bf= EH;//rc->bf= EH;L_Rotate(T);break;case EH: T->bf= EH;//rc->bf= EH;L_Rotate(T);break;case LH: ld=rc->lchild;switch(ld->bf){ case LH: T->bf=RH;rc->bf=EH;break;case EH: T->bf=rc->bf=EH;break;case RH: T->bf = EH;rc->bf=LH;break;} ld->bf=EH;R_Rotate(T->rchild);L_Rotate(T);} }

voidSDelete(BSTree&T,BSTree&q,BSTree&s,int&shorter){ if(s->rchild){ SDelete(T,s,s->rchild,shorter);if(shorter)switch(s->bf){ case EH: s->bf = LH;shorter = 0;break;case RH: s->bf = EH;shorter = 1;break;case LH: DELeftBalance(s);shorter = 0;break;} return;}

T->data = s->data;if(q!= T)q->rchild = s->lchild;else q->lchild = s->lchild;shorter = 1;} //刪除結點

Status Delete(BSTree&T,int&shorter){ BSTree q;if(!T->rchild){ q = T;T = T->lchild;free(q);shorter = 1;} else if(!T->lchild){ q = T;T= T->rchild;free(q);shorter = 1;} else{ SDelete(T,T,T->lchild,shorter);if(shorter)switch(T->bf){ case EH: T->bf = RH;shorter = 0;break;case LH: T->bf = EH;shorter = 1;break;case RH: DERightBalance(T);shorter = 0;break;} } return 1;}

Status DeleteAVL(BSTree&T,ElemTypee,int&shorter){ int sign = 0;if(!T){ return sign;} else{ if(e == T->data){ sign = Delete(T,shorter);return sign;}

else if(e < T->data){ sign = DeleteAVL(T->lchild,e,shorter);if(shorter)switch(T->bf){ case EH: T->bf = RH;shorter = 0;break;case LH: T->bf = EH;shorter = 1;break;case RH: DERightBalance(T);shorter = 0;break;}

return sign;} else{ sign = DeleteAVL(T->rchild,e,shorter);if(shorter)switch(T->bf){ case EH: T->bf = LH;shorter = 0;break;case RH: T->bf = EH;break;case LH: DELeftBalance(T);shorter = 0;break;} return sign;}

} } //合并

void merge(BSTree&T1,BSTree &T2){ int taller = 0;if(!T2)return;merge(T1,T2->lchild);InsertAVL(T1,T2->data,taller);merge(T1,T2->rchild);} //分裂

void split(BSTreeT,ElemTypee,BSTree&T1,BSTree &T2){ int taller = 0;if(!T)return;split(T->lchild,e,T1,T2);if(T->data > e)InsertAVL(T2,T->data,taller);else InsertAVL(T1,T->data,taller);split(T->rchild,e,T1,T2);} //分裂

voidsplitBSTree(BSTreeT,ElemTypee,BSTree&T1,BSTree &T2){ BSTree t1 = NULL,t2 = NULL;split(T,e,t1,t2);T1 = t1;T2 = t2;return;}

//構建

voidCreatBSTree(BSTree&T){ intnum,i,e,taller = 0;printf(“輸入結點個數:”);scanf(“%d”,&num);printf(“請順序輸入結點值n”);for(i = 0;i

voidPrintBSTree(BSTree&T,intlev){ int i;if(T->rchild)PrintBSTree(T->rchild,lev+1);for(i = 0;i data);if(T->lchild)PrintBSTree(T->lchild,lev+1);} void Start(BSTree&T1,BSTree &T2){

intcho,taller,e,k;taller = 0;k = 0;while(1){ system(“cls”);printf(“平衡二叉樹操作的演示 nn”);printf(“********************************n”);printf(“平衡二叉樹顯示區 n”);printf(“T1樹n”);if(!T1)printf(“n 當前為空樹n”);else{ PrintBSTree(T1,1);}

printf(“T2樹n”);if(!T2)printf(“n 當前為空樹n”);else PrintBSTree(T2,1);printf(“n******************************************************************************n”);printf(“T1操作:1.創建 2.插入 3.查找 4.刪除 10.分裂n”);printf(“T2操作:5.創建 6.插入 7.查找 8.刪除 11.分裂n”);printf(“ 9.合并 T1,T2 0.退出n”);printf(“******************************************************************************n”);printf(“輸入你要進行的操作:”);scanf(“%d”,&cho);switch(cho){ case 1: CreatBSTree(T1);break;case 2: printf(“請輸入要插入關鍵字的值”);scanf(“%d”,&e);InsertAVL(T1,e,taller);break;case 3: printf(“請輸入要查找關鍵字的值”);scanf(“%d”,&e);

if(SearchBST(T1,e))printf(“查找成功!n”);else printf(“查找失敗!n”);printf(“按任意鍵返回87”);getchar();getchar();break;case 4: printf(“請輸入要刪除關鍵字的值”);scanf(“%d”,&e);if(DeleteAVL(T1,e,k))printf(“刪除成功!n”);else printf(“刪除失敗!n”);printf(“按任意鍵返回”);getchar();getchar();break;case 5: CreatBSTree(T2);break;case 6: printf(“請輸入要插入關鍵字的值”);scanf(“%d”,&e);InsertAVL(T2,e,taller);break;case 7: printf(“請輸入要查找關鍵字的值”);scanf(“%d”,&e);

if(SearchBST(T2,e))printf(“查找成功!n”);else printf(“查找失敗!n”);printf(“按任意鍵返回”);getchar();getchar();break;case 8: printf(“請輸入要刪除關鍵字的值”);scanf(“%d”,&e);if(DeleteAVL(T2,e,k))printf(“刪除成功!n”);else printf(“刪除失敗!n”);printf(“按任意鍵返回”);getchar();getchar();break;case 9: merge(T1,T2);T2 = NULL;printf(“合并成功,按任意鍵返回”);getchar();getchar();break;case 10: printf(“請輸入要中間值字的值”);scanf(“%d”,&e);splitBSTree(T1,e,T1,T2);printf(“分裂成功,按任意鍵返回”);getchar();getchar();break;case 11: printf(“請輸入要中間值字的值”);scanf(“%d”,&e);splitBSTree(T2,e,T1,T2);printf(“分裂成功,按任意鍵返回”);getchar();getchar();break;case 0: system(“cls”);exit(0);} } }

main(){ BSTree T1 = NULL;BSTree T2 = NULL;Start(T1,T2);}

第五篇:數據結構課程設計報告二叉樹的應用操作

數據結構課程設計報告

題目名稱: 二叉樹的應用問題 專業班級: 計算機科學與技術

學生姓名:

學生學號:

指導教師:

目錄

一、題目要求..............................................二、需求分析..............................................三、概要設計..............................................四、詳細設計..............................................五、調試分析.............................................六、心得體會.............................................一、題目要求

實現二叉樹,求解若干二叉樹應用問題

? 實現二叉鏈表表示的二叉樹,包括下列運算:

? 建立一棵二叉樹;

? 按先序、中序和后序遍歷二叉樹; ? 按層次遍歷;

? 求一棵二叉樹的高度;

? 交換一棵二叉樹的左右子樹;

? 設計一個菜單驅動程序,測試上述算法

二、需求分析

建立一棵二叉樹:

int CreateBiTree(BiTree &T)按先序遍歷二叉樹:

void PreOrder(BiTree &T)按中序遍歷二叉樹:

void InOrder(BiTree &T)按后序遍歷二叉樹:

void PostOrder(BiTree &T)按層次遍歷:

void LevelOrder(BiTree &T)求一棵二叉樹的高度:

int Depth(BiTree &T)交換一棵二叉樹的左右子樹:int PreOrderTraverse(BiTree T)菜單驅動程序:

void menu()

三、概要設計

定義二叉樹的存儲結構,每個結點中設置三個域,即值域、左指針域、右指針域。要建立二叉樹T的鏈式存儲結構,即建立二叉鏈表。根據輸入二叉樹結點的形式不同,建立的方法也不同,本系統采用先序序列遞歸建立二叉樹。

先序遍歷二叉樹的操作定義為:若二叉樹為空,則空操作;否則:(1)訪問根結點;(2)先序遍歷左子樹;(3)先序遍歷右子樹。

中序遍歷二叉樹的操作定義為:若二叉樹為空,則空操作;否則:(1)中序遍歷左子樹;(2)訪問根結點;

(3)中序遍歷右子樹。

后序遍歷二叉樹的操作定義為:若二叉樹為空,則空操作;否則:(1)后序遍歷左子樹;(2)后序遍歷右子樹;(3)訪問根結點。

層次遍歷二叉樹的操作選用隊列的存儲結構。先建立一個長度為1的隊列,利用while循環,將根結點放入隊首,再將隊列長度加一。然后依次遍歷左子樹和右子樹,每遍歷一次,2、先序遍歷二叉樹:

void PreOrder(BiTree &T){ if(!T)

return;cout<data<<“ ”;PreOrder(T->left_child);PreOrder(T->right_child);}

3、中序遍歷二叉樹:

void InOrder(BiTree &T){ if(!T)return;InOrder(T->left_child);cout<data<<“ ”;InOrder(T->right_child);}

4、后序遍歷二叉樹:

void PostOrder(BiTree &T){ if(!T)return;PostOrder(T->left_child);PostOrder(T->right_child);cout<data<<“ ”;}

5、按層次遍歷:

void LevelOrder(BiTree &T){ BiTree queue[100];int front,rear;if(T==NULL)return;front=-1;rear=0;queue[rear]=T;while(front!=rear){ front++;cout<data<<“ ”;if(queue[front]->left_child!=NULL){ rear++;queue[rear]=queue[front]->left_child;

cin>>a;if(a>=0||a<=7){ switch(a){ case 0:

{

cout<<“建立后的二叉樹為:n”;

Output(T);

cout<

}

system(“pause”);

break;case 1:

cout<<“該樹的樹深為: ”<

system(“pause”);

break;case 2:

{

cout<<“該樹以先序遍歷輸出為:n”;

PreOrder(T);

cout<

}

system(“pause”);

break;case 3:

{

cout<<“該樹以中序遍歷輸出為:n”;

InOrder(T);

cout<

}

system(“pause”);

break;case 4:

{

cout<<“該樹以后序遍歷輸出為:n”;

PostOrder(T);

cout<

}

system(“pause”);

break;case 5:

{

cout<<“該樹的層次遍歷:n”;

LevelOrder(T);

cout<

(二)詳細程序代碼:{ if(!T){

cout<<“空樹!n”;

return;} cout<data<<“ ”;if(T->left_child)Output(T->left_child);if(T->right_child)Output(T->right_child);}

int Depth(BiTree &T){ int i,j;if(!T)return 0;i=Depth(T->left_child);j=Depth(T->right_child);return(i>j?i:j)+1;}

void PreOrder(BiTree &T){ if(!T)

return;cout<data<<“ ”;PreOrder(T->left_child);PreOrder(T->right_child);}

void InOrder(BiTree &T){ if(!T)return;InOrder(T->left_child);cout<data<<“ ”;InOrder(T->right_child);}

void PostOrder(BiTree &T){ if(!T)return;PostOrder(T->left_child);PostOrder(T->right_child);cout<data<<“ ”;}

void LevelOrder(BiTree &T)

cout<<“<<

1.二叉樹樹深

>>”<

cout<<“<<

2.二叉樹的先序遍歷

>>”<

cout<<“<<

3.二叉樹的中序遍歷

>>”<

cout<<“<<

4.二叉樹的后序遍歷

>>”<

cout<<“<<

5.二叉樹的層次遍歷

>>”<

cout<<“<<

6.左右孩子交換

>>”<

cout<<“<<

7.退出

>>”<

cout<<“*******************************************************************”<

void main(){

int br,a;BiTree T;br=CreateBiTree(T);

while(1){

menu();

cout<<“請輸入選擇的命令-->”;

cin>>a;

if(a>=0||a<=7)

{

switch(a)

{

case 0:

{

cout<<“建立后的二叉樹為:n”;

Output(T);

cout<

}

system(“pause”);

break;

case 1:

cout<<“該樹的樹深為: ”<

system(“pause”);

break;

case 2:

{

cout<<“該樹以先序遍歷輸出為:n”;

PreOrder(T);

cout<

}

system(“pause”);

break;

case 3:

{

cout<<“該樹以中序遍歷輸出為:n”;

(一)先序輸入二叉樹:

(二)建立一棵二叉樹:

1后序遍歷:

(四)按層次遍歷:

3中序遍歷交換后的二叉樹:

六、心得體會

這次數據結構課程設計我選擇的題目是二叉樹的應用操作,題目要求中最難的部分是二叉樹的層次遍歷。在實現這個要求的時候我想了很久,最后通過在CSDN上找到了解決思路,就是用隊列的方式。雖然是二叉樹的題目,但是和其他知識點都有很多內在的聯系。經過這次的實驗,我不僅在二叉樹的應用操作層面上更加熟悉,對二叉樹的理解更加深刻,更重要的是我認識到知識要融會貫通才是它的價值所在。我的C語言基礎不是很扎實,所以在寫代碼的時候也遇到很大的困難。像很基礎的“j?i:j”也是通過翻閱以前的書籍才找到答案。還有在編程過程中的習慣也不是很好,函數及變量的命名等細節問題,如果不加以注意的話,會對后面的編譯調試造成很多不必要的麻煩。我應該在以后的學習中加強實踐,這樣才能更扎實地掌握所學知識點,更有效地將書本上的知識變成解決實際問題的經驗。

下載數據結構課程設計- 平衡二叉樹操作word格式文檔
下載數據結構課程設計- 平衡二叉樹操作.doc
將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
點此處下載文檔

文檔為doc格式


聲明:本文內容由互聯網用戶自發貢獻自行上傳,本網站不擁有所有權,未作人工編輯處理,也不承擔相關法律責任。如果您發現有涉嫌版權的內容,歡迎發送郵件至:645879355@qq.com 進行舉報,并提供相關證據,工作人員會在5個工作日內聯系你,一經查實,本站將立刻刪除涉嫌侵權內容。

相關范文推薦

    數據結構二叉樹操作驗證實驗報告

    班級:計算機11-2 學號:40 姓名:朱報龍成績:_________ 實驗七 二叉樹操作驗證 一、 實驗目的 ⑴ 掌握二叉樹的邏輯結構; ⑵ 掌握二叉樹的二叉鏈表存儲結構; ⑶ 掌握基于二叉鏈表......

    數據結構作業——二叉樹

    數據結構實驗報告二 題目: 用先序遞歸過程監理二叉樹(存儲結構:二叉鏈表) 輸入數據按先序遍歷輸入,當某節點左子樹或者右子樹為空時,輸入‘*’號,如輸入abc**d**e**時,得到的二叉樹......

    二叉樹遍歷課程設計】

    數據結構程序設計報告 學院: 班級: 學號:姓名: 實驗名稱:二叉樹的建立與遍歷 一、 實驗目的: 1.掌握二叉樹的二叉鏈表存儲結構; 2.掌握二叉樹創建方法; 3.掌握二叉樹的先序、中序、......

    2012數據結構課程設計

    數 據 結 構 課程設計報告 題 目: 一元多項式計算 專 業: 信息管理與信息系統 班 級: 2012級普本班 學 號: 201201011367 姓 名: 左帥帥 指導老師: 郝慎學 時 間: 一、課程設計題目......

    數據結構課程設計

    數據結構課程設計 1. 赫夫曼編碼器 設計一個利用赫夫曼算法的編碼和譯碼系統,重復地顯示并處理以下項目,直到選擇退出為止。 要求: 1) 將權值數據存放在數據文件(文件名為data.......

    《數據結構》課程設計文檔格式(定稿)

    課程設計報告的內容設計結束后要寫出課程設計報告,以作為整個課程設計評分的書面依據和存檔材料.設計報告以規定格式的電子文檔書寫,打印并裝訂,排版及圖,表要清楚,工整. 裝......

    課程設計(數據結構)

    課程設計題目 1、 運動會分數統計 任務:參加運動會有n個學校,學校編號為1……n。比賽分成m個男子項目,和w個女子項目。項目編號為男子1……m,女子m+1……m+w。不同的項目取前五......

    數據結構課程設計

    數據結構課程設計 計算機科學與技術2008級1班 課程設計題目:圖書借閱管理系統 姓名: 學號: 一.需求分析說明 圖書借閱處理過程簡述處理過程主要包含:新增圖書上架、辦理圖證、圖......

主站蜘蛛池模板: 成人一区二区三区视频在线观看| 中文字幕人妻一区二区三区| 亚洲妇女水蜜桃av网网站| 无码人妻久久1区2区3区| 在线高清亚洲精品二区| 大胸少妇午夜三级| 国产成人综合亚洲欧美日韩| 欧美自拍亚洲综合丝袜| 成人免费视频在线观看| 精品久久久久久久免费影院| 国产精品国产三级国产av′| 超碰成人人人做人人爽| 中文字幕理伦午夜福利片| 2021久久超碰国产精品最新| 国产乱子伦60女人的皮视频| 亚洲第一综合天堂另类专| 国产老熟女狂叫对白| 亚洲国产精品久久一线app| 亚洲色av影院久久无码| 国产欧美熟妇另类久久久| 欧美色欧美亚洲高清在线视频| 水蜜桃无码av在线观看| 成人啪啪一区二区三区| 国产在线精品一区二区在线观看| 国内精品国产三级国产av| 国产无遮挡裸体美女视频| 国产欧美日韩综合精品二区| 人妻丰满熟妇av无码区app| 日本特黄特黄刺激大片| 国内精品人妻无码久久久影院导航| 免费成人电影在线观看| 日韩人妻不卡一区二区三区| 亚洲aⅴ天堂av天堂无码| 丝袜熟女国偷自产中文字幕亚洲| 夜夜躁狠狠躁日日躁202| 亚洲视频日韩视欧美视频| 成 人 黄 色 免费 网站无毒| 色老板精品视频在线观看| 毛片24种姿势无遮无拦| 国产精品午夜无码av天美传媒| 人人妻人人妻人人片色av|