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

數據結構作業——二叉樹

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

第一篇:數據結構作業——二叉樹

數據結構實驗報告二

題目:

用先序遞歸過程監理二叉樹(存儲結構:二叉鏈表)

輸入數據按先序遍歷輸入,當某節點左子樹或者右子樹為空時,輸入‘*’號,如輸入abc**d**e**時,得到的二叉樹為:

并用如下實力測試:

算法思路:

顯然,建立一個二叉鏈表存儲的二叉樹,如果不考慮效率要求,考慮到程序的簡介性,遞歸建立和遞歸遍歷是一種很好的辦法。

利用C++的類模板的方法實現建立,遍歷,輸出等二叉樹操作。首先利用構造函數實現先序遍歷建立二叉樹,然后調用類模板中已經聲明好的四種遍歷函數,將遍歷結果輸出,檢驗建立好的二叉樹是否為要求的二叉樹。

初始化:利用構造函數建立二叉樹。采用先序遞歸的調用方法,構造函數主體如下:

template BiTree::BiTree(){ this->root = Creat();//利用this指針調用creat函數 }

template BiNode* BiTree::Creat()//定義構造函數 { BiNode* root;T aa;cout<<“請按前序序列方式輸入節點數據,每次輸入一個”<>aa;if(aa==“*”)root = NULL;else{

root = new BiNode;

//生成一個結點 root->data=aa;

root->lchild = Creat();

//遞歸建立左子樹

root->rchild = Creat();

//遞歸建立右子樹

} return root;} 構造這樣的函數,可以在輸入時,按先序遍歷順序每次輸入一個節點的數據,可以實現任意二叉樹的構造。

為了檢驗構造的二叉樹是否為預先設想的二叉樹,需要遍歷二叉樹并進行輸出??紤]到單一的輸出并不能確定唯一的二叉樹,因此對遍歷二叉樹的四種常用發方法,即先序遍歷,中序遍歷,后續遍歷,層次遍歷分別實現,通過遍歷結果檢驗構造的二叉樹是否為預先設計好的二叉樹。

先序遍歷:采用遞歸的方法建立。template voidBiTree::xianxu(BiNode *root){ if(root==NULL)return;//如果節點為空,則返回空 else{ cout<data<<“ ”;//訪問根節點

xianxu(root->lchild);//先序遍歷樹的左子樹 xianxu(root->rchild);//先序遍歷樹的右子樹

} 中序遍歷:遞歸方法建立: template voidBiTree::zhongxu(BiNode *root){

if(root==NULL)return;

//如果節點為空,則返回空 else{ zhongxu(root->lchild);

//中序遞歸遍歷root的左子樹 cout<data<<“ ”;

//訪問根結點

zhongxu(root->rchild);

//中序遞歸遍歷root的右子樹

}

} 后序遍歷:遞歸方法建立: template voidBiTree::houxu(BiNode *root){

if(root==NULL)

return;

//如果節點為空,返回空 else{ houxu(root->lchild);

//后序遞歸遍歷root的左子樹 houxu(root->rchild);

//后序遞歸遍歷root的右子樹 cout<data<<“ ”;

//訪問根節點

} } 層序遍歷:采用非遞歸方法。利用隊列的方法層序遍歷二叉樹。建立一個隊列,在訪問一個節點的時候,把它的左孩子和右孩子入隊,并且將這個節點出隊。當隊列為空時,就完成了對二叉樹的層序遍歷。

template voidBiTree::cengxu(BiNode *root){ constintMaxSize = 100;int front = 0;int rear = 0;//利用隊列的方法對樹進行層序遍歷 BiNode* Q[MaxSize];BiNode* q;if(root==NULL)return;// 如果節點為空,返回空 else{

Q[rear++] = root;// 若節點不為空,則該節點入隊 while(front!= rear)

{

q = Q[front++];//只要隊列不為空,則節點依次出隊 cout<data<<“ ”;

if(q->lchild!= NULL)

Q[rear++] = q->lchild;

if(q->rchild!= NULL)

Q[rear++] = q->rchild;// 同時,該節點的雙子入隊

} } } 函數主體部分:聲明一個類中的對象,調用構造函數,建立二叉樹,并輸出四種遍歷結果,檢驗輸出結果。

int main(){

BiTreeshu;//聲明類中一個對象,在構造了一顆樹

BiNode* root = shu.Getroot();//獲取指向根結點的指針

cout<<“前序遍歷序列為 ”<

程序結構:

主函數建立一個類模板定義構造函數,析構函數,以及成員函數聲明類中的一個對象調用構造函數,構造一顆二叉樹層序遍歷二叉樹后序遍歷二叉樹中序遍歷二叉樹前序遍歷二叉樹獲取該二叉樹的根節點將結果輸出,人工檢驗 源代碼:

#include using namespace std;

template struct BiNode

{

T data;

BiNode *lchild, *rchild;};

template class BiTree

{ public: BiTree();

//構造函數,初始化一棵二叉樹 ~BiTree(void);

//析構函數,釋放二叉鏈表中各結點的存儲空間

BiNode* Getroot();

//獲得指向根結點的指針

void xianxu(BiNode *root);

//前序遍歷二叉樹

void zhongxu(BiNode *root);

//中序遍歷二叉樹

void houxu(BiNode *root);

//后序遍歷二叉樹

void cengxu(BiNode *root);

//層序遍歷二叉樹 private:

BiNode *root;

BiNode *Creat();

void Release(BiNode *root);

};template BiTree::BiTree(){ this->root = Creat();//利用this指針調用creat函數 }

template BiNode* BiTree::Creat()//定義構造函數 { BiNode* root;T aa;cout<<“請按前序序列方式輸入節點數據,每次輸入一個”<>aa;

if(aa==“*”)root = NULL;

else{

root = new BiNode;

//生成一個結點

root->data=aa;

root->lchild = Creat();

//遞歸建立左子樹

root->rchild = Creat();

//遞歸建立右子樹

}

return root;}

template BiTree::~BiTree(void){ Release(root);//析構函數,釋放存儲指針所需要的空間 }

template BiNode* BiTree::Getroot()//獲取根節點所在指針的位置 { return root;}

template void BiTree::xianxu(BiNode *root){ if(root==NULL)return;//如果節點為空,則返回空

else{

cout<data<<“ ”;//訪問根節點

xianxu(root->lchild);//先序遍歷樹的左子樹

xianxu(root->rchild);//先序遍歷樹的右子樹

} }

template void BiTree::zhongxu(BiNode *root){

if(root==NULL)return;

//如果節點為空,則返回空

else{

zhongxu(root->lchild);

//中序遞歸遍歷root的左子樹

cout<data<<“ ”;

//訪問根結點

zhongxu(root->rchild);

//中序遞歸遍歷root的右子樹

} }

template void BiTree::houxu(BiNode *root){

if(root==NULL)

return;

//如果節點為空,返回空

else{

houxu(root->lchild);

//后序遞歸遍歷root的左子樹

houxu(root->rchild);

//后序遞歸遍歷root的右子樹

cout<data<<“ ”;

//訪問根節點

} }

template void BiTree::cengxu(BiNode *root){

const int MaxSize = 100;int front = 0;int rear = 0;//利用隊列的方法對樹進行層序遍歷

BiNode* Q[MaxSize];

BiNode* q;if(root==NULL)return;// 如果節點為空,返回空

else{

Q[rear++] = root;// 若節點不為空,則該節點入隊

while(front!= rear)

{

q = Q[front++];//只要隊列不為空,則節點依次出隊

cout<data<<“ ”;

if(q->lchild!= NULL)

Q[rear++] = q->lchild;

if(q->rchild!= NULL)

Q[rear++] = q->rchild;// 同時,該節點的雙子入隊

} } }

template void BiTree::Release(BiNode* root)//析構函數,釋放存儲空間 {

if(root!= NULL){

Release(root->lchild);

//釋放左子樹

Release(root->rchild);

//釋放右子樹

delete root;

}

}

int main(){

BiTree shu;//聲明類中一個對象,在構造了一顆樹

BiNode* root = shu.Getroot();//獲取指向根結點的指針

cout<<“前序遍歷序列為 ”<

cout<<“層序遍歷序列為”<

通過對結果的分析,發現輸出結果與建立二叉樹時的輸入完全符合,說明程序的運行結果是正確的。

心得體會:

1)函數遞歸的方法可以在相當程度上使程序簡潔,避免代碼的冗長復雜。2)構造函數如果帶參數,在聲明對象的時候應該將實參指出來。但是本題中構造函數位遞歸調用,初始的根節點的數據值由鍵盤輸入,因此無法在聲明對象時引入實參。所以最后選擇了無參但是引用了this指針的構造函數。可見,對于構造函數的含參調用應該小心謹慎。

3)編程時,要不停得檢驗自己的輸入與輸出,必要的時候需要人工進行計算,以保證程序的運行按照預先的設想。

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

班級:計算機11-2 學號:40 姓名:朱報龍

成績:_________

實驗七 二叉樹操作驗證

一、實驗目的

⑴ 掌握二叉樹的邏輯結構;

⑵ 掌握二叉樹的二叉鏈表存儲結構;

⑶ 掌握基于二叉鏈表存儲的二叉樹的遍歷操作的實現。

二、實驗內容

⑴ 建立一棵含有n個結點的二叉樹,采用二叉鏈表存儲;

⑵ 前序(或中序、后序)遍歷該二叉樹。

三、設計與編碼

#include using namespace std;template class BTree;template //***********************二叉樹結點類定義********************** class BTreeNode { friend class BTree ;T data;BTreeNode *lchild,*rchild;public: BTreeNode():lchild(NULL),rchild(NULL){} BTreeNode(T d,BTreeNode *r=NULL):data(d),lchild(l),rchild(r){}

*l=NULL,BTreeNode T getdata(){return data;} BTreeNode * getleft(){return lchild;} BTreeNode * getright(){return rchild;} };//***********************END******************************** //***********************二叉樹模板類定義******************* template class BTree { public: BTree(T a[],int n);void preorder(void visit(BTreeNode *p));static void preorder(BTreeNode * p,void visit(BTreeNode *p));//遞歸前序遍歷

void inorder(void visit(BTreeNode *p));static void inorder(BTreeNode * p,void visit(BTreeNode *p));//遞歸中序遍歷

void postorder(void visit(BTreeNode *p));static void postorder(BTreeNode * p,void visit(BTreeNode * p));//遞歸后序遍歷

static void fun(BTreeNode *p){cout <

data;}//訪問結點 protected: BTreeNode * root;private: T* a;int n;BTreeNode * build0(int i);};

//***********************建樹******************************* template BTreeNode * BTree ::build0(int i)//遞歸建樹 { BTreeNode *p;int l,r;if((i <=n)&&(a[i-1]!=' ')){ p=new BTreeNode ;p->data=a[i-1];l=2*i;r=2*i+1;p->lchild=build0(l);p->rchild=build0(r);return(p);} else return(NULL);}

template BTree ::BTree(T a[],int n){ this->a=a;this->n=n;root=build0(1);cout <<“遞歸建樹成功!”<

//***********************遍歷******************************* template void BTree ::preorder(void visit(BTreeNode *p))//遞歸前序遍歷 { preorder(root,visit);cout < void BTree ::preorder(BTreeNode * p,void visit(BTreeNode *p)){ if(p!=NULL){ visit(p);preorder(p->lchild,visit);preorder(p->rchild,visit);} } template void BTree ::inorder(void visit(BTreeNode *p)){ inorder(root,visit);cout < void BTree ::inorder(BTreeNode * p,void visit(BTreeNode *p)){ if(p!=NULL){ inorder(p->lchild,visit);visit(p);inorder(p->rchild,visit);} } template void BTree ::postorder(void visit(BTreeNode *p))//遞歸后序遍歷 { postorder(root,visit);cout < void BTree ::postorder(BTreeNode * p,void visit(BTreeNode *p)){ if(p!=NULL){ postorder(p->lchild,visit);postorder(p->rchild,visit);visit(p);} } void main(){ char *str=“abcd e”;cout<s(str,6);cout <>choice;cout <

{cout <<“遞歸先序遍歷二叉樹:”;s.preorder(s.fun);cout <

答:經常忘記對頭結點的定義,以至于程序出錯,經定義頭結點,使程序正常運行。

b)程序運行的結果如何?

四、實驗小結 多練習,多上機,耐心調試程序,找出錯誤,多總結。

第三篇:數據結構-二叉樹的遍歷實驗報告

實驗報告

課程名:數據結構(C語言版)實驗名:二叉樹的遍歷 姓名:

班級:

學號:

時間:2014.11.03

一 實驗目的與要求

1.掌握二叉樹的存儲方法 2.掌握二叉樹的三種遍歷方法

3.實現二叉樹的三種遍歷方法中的一種 二 實驗內容

? 接受用戶輸入一株二叉樹

? 輸出這株二叉樹的前根, 中根, 后根遍歷中任意一種的順序 三 實驗結果與分析

//*********************************************************** //頭文件

#include #include //*********************************************************** //宏定義

#define OK 1 #define ERROR 0 #define OVERFLOW 0

//***********************************************************

typedef struct BiTNode { //二叉樹二叉鏈表存儲結構 char data;struct BiTNode *lChild,*rChild;}BiTNode,*BiTree;//*********************************************************** int CreateBiTree(BiTree &T){ //按先序次序輸入二叉中樹結點的值,空格表示空樹 //構造二叉鏈表表示的二叉樹T char ch;fflush(stdin);scanf(“%c”,&ch);if(ch==' ')T=NULL;else{ if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))return(OVERFLOW);T->data=ch;CreateBiTree(T->lChild);CreateBiTree(T->rChild);} return(OK);} //********************************************************* void PreOrderTraverse(BiTree T){ //采用二叉鏈表存儲結構,先序遍歷二叉樹的遞歸算法 if(T){ printf(“%c”,T->data);PreOrderTraverse(T->lChild);PreOrderTraverse(T->rChild);} } /***********************************************************/ void InOrderTraverse(BiTree T){ //采用二叉鏈表存儲結構,中序遍歷二叉樹的遞歸算法 if(T){ InOrderTraverse(T->lChild);printf(“%c”,T->data);InOrderTraverse(T->rChild);} }

//*********************************************************** void PostOrderTraverse(BiTree T){ //采用二叉鏈表存儲結構,后序遍歷二叉樹的遞歸算法 if(T){ PostOrderTraverse(T->lChild);PostOrderTraverse(T->rChild);printf(“%c”,T->data);} }

//*********************************************************** void main(){ //主函數分別實現建立并輸出先、中、后序遍歷二叉樹

printf(“please input your tree follow the PreOrder:n”);BiTNode *Tree;CreateBiTree(Tree);printf(“n先序遍歷二叉樹:”);PreOrderTraverse(Tree);printf(“n中序遍歷二叉樹:”);InOrderTraverse(Tree);printf(“n后序遍歷二叉樹:”);PostOrderTraverse(Tree);}

圖1:二叉樹的遍歷運行結果

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

課 程 設 計 報 告

一. 需求分析

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 —

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

課 程 設 計 報 告

課程名稱 數據結構課程設計 題 目平衡二叉樹操作 指導教師 設計起止日 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 —

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

文檔為doc格式


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

相關范文推薦

    數據結構平衡二叉樹的操作演示

    平衡二叉樹操作的演示 1. 需求分析 本程序是利用平衡二叉樹,實現動態查找表的基本功能:創建表,查找、插入、刪除。 具體功能: (1) 初始,平衡二叉樹為空樹,操作界面給出創建、查找、......

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

    數據結構與算法 課程設計報告 課程設計題目: 二叉樹平衡的判定 專業班級: 信息與計算科學1001班 姓 名: 謝煒 學 號:100701114 設計室號: 理學院機房 設計時間: 2011-12-26 批閱時......

    數據結構作業

    1.(1)問題的描述:設計一個程序exp1-1.cpp,輸出所有小于等于n(n為一個大于二的正整數)的素數。要求:(1)每行輸出10個素數;(2)盡可能采用較優的算法。 (2)解決思想:判斷一個整數n是......

    數據結構實驗報告——中序遍歷二叉樹[五篇范文]

    班級:380911班 學號:57000211 姓名:徐敏 實驗報告 一,實驗目的: ·掌握二叉樹的鏈式存儲結構; ·掌握構造二叉樹的方法; ·加深對二叉樹的中序遍歷的理解; 二,實驗方法: ·用遞歸調......

    數據結構實驗報告-二叉樹的實現與遍歷

    《數據結構》 第六次實驗報告 學生姓名 學生班級 學生學號 指導老師 重慶郵電大學計算機學院 計算機專業實驗中心 一、實驗內容 1) 采用二叉樹鏈表作為存儲結構,完成二叉樹......

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

    數據結構課程設計報告 題目名稱: 二叉樹的應用問題 專業班級: 計算機科學與技術 學生姓名:學生學號:指導教師: 目錄 一、題目要求 .................................................

    數據結構上機作業(5篇)

    實驗一 線性表 一、實驗題線性表的應用———多項式計算 二、程序設計思路 包括每個函數的功能說明,及一些重要函數的算法實現思路一鏈式存儲: 1.void InitPoly(LNode *&p)......

    C++數據結構 大作業課程設計

    C++/數據結構 大作業/課程設計——【校園導游咨詢】【停車場管理】娃娃們可以收著以后用 絕對純手工打造 內含類模塊/一維指針數組(謹以此程序供大家參考。運行結果后面有貼......

主站蜘蛛池模板: 国产精品亚洲色婷婷99久久精品| 色九九| 小??戳进?无遮挡网站| 国产18禁黄网站免费观看| 老太做爰????视频| 又嫩又硬又黄又爽的视频| 国产精品自产拍在线观看花钱看| 无码一区二区三区久久精品| 午夜免费福利小电影| 一本色道久久88精品综合| 亚洲韩欧美第25集完整版| 超清无码av最大网站| 粗大的内捧猛烈进出视频| 成 人 色综合 综合网站| 无码人妻在线一区二区三区免费| 亚洲成av人片在线观看无码不卡| 好男人www在线影视社区| 特殊重囗味sm在线观看无码| 亚洲日本一区二区一本一道| √新版天堂资源在线资源| 国产免费无遮挡吸乳视频app| 成人无码视频免费播放| 日韩亚洲欧美在线com| 中文字幕一本久久综合| 狠狠色噜噜狠狠狠狠色综合久| 久久成人国产精品免费软件| 日本强伦姧熟睡人妻完整视频| 亚洲精品无人区| 亚洲精品欧美综合四区| 国产亚洲午夜高清国产拍精品| 日本丰满人妻xxxxxhd| 国产亚洲精品久久久久久入口| 欧洲熟妇色xxxx欧美老妇| 欧美无人区码suv| 亚洲全国最大的人成网站| 国产婷婷在线精品综合| 无码人妻一区二区无费| 大粗鳮巴久久久久久久久| 亚洲成vr人片在线观看天堂无码| 久久久久亚洲精品无码网址色欲| 人妻少妇456在线视频|