日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构源码笔记(C语言):二叉平衡树的相关操作算法

發布時間:2025/4/16 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构源码笔记(C语言):二叉平衡树的相关操作算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
//二叉平衡樹的相關運算 #include<stdio.h> #include<malloc.h> #include<string.h>typedef char InfoType; typedef int KeyType;typedef struct node {KeyType key;int bf;InfoType data;struct node *lchild,*rchild; }BSTNode;void LeftProcess(BSTNode * &p,int &taller) //對以指針P所指結點為根的二叉樹做左平衡旋轉處理,本算法結束時,指針P指向新的根結點 {BSTNode *p1,*p2;if(p->bf==0)//原本左、右子樹等高,現因左子樹增高而是樹增高{p->bf=1;taller=1;}else if(p->bf==-1)//原本右子樹比左子樹高,現左右子樹等高{p->bf=0;taller=0;}else //原本左子樹比右子樹高,需做左子樹的平衡處理{p1=p->lchild;//p指向*p的左子樹根結點if(p1->bf==1)//新結點插入在*b的左孩子的左子樹上,要做LL調整{p->lchild=p1->rchild;p1->rchild=p;p->bf=p1->bf=0;p=p1;}else if(p1->bf==-1)//新結點插入在*b的左孩子的右子樹上,要做LR調整{p2=p1->rchild;p1->rchild=p2->lchild;p2->lchild=p1;p->lchild=p2->rchild;p2->rchild=p;if(p2->bf==0)//新結點插在*P2處做為葉子結點的情況p->bf=p1->bf=0;else if(p2->bf==1)//新結點插在*P2的左子樹上的情況{p1->bf=0;p->bf=-1;}else //新結點插在*P2的右子樹上的情況{p1->bf=1;p->bf=0;}p=p2;p->bf=0;//仍將P所指向新的根結點,并置其bf值為0}taller=0;} }void RightProcess(BSTNode *&p,int &taller)//對以指針P所指結點為根的二叉樹做右平衡旋轉處理,本算法結束時,指針P指向新的根結點 {BSTNode *p1,*p2;if(p->bf==0)//原本右子樹、左子樹等高,現因右子樹增高而使樹增高{p->bf=-1;taller=1;}else if(p->bf==1)//原本左右樹比左子樹高,現左右子樹等高{p->bf=0;taller=0;}else//原本右子樹比左子樹高,需做右子樹平衡處理{p1=p->rchild;if(p1->bf==-1)//新結點插入在*b的右孩子的右子樹上,要做RR調整{p->rchild=p1->lchild;p1->lchild=p;p->bf=p1->bf=0; p=p1;} else if(p1->bf==1)//新結點插入在*b的右孩子的左子樹上,要做RL調整{p2=p1->lchild;p1->lchild=p2->rchild;p2->rchild=p1;p->rchild=p2->lchild;p2->lchild=p;if(p2->bf==0)//新結點插入在*p2處作為葉子結點的情況p->bf=p1->bf=0;else if(p2->bf==-1)//新結點插入在*p2的右子樹的情況{p1->bf=0;p->bf=1;}else //新結點插入在*p2的左子樹的情況{p1->bf=-1;p->bf=0;}p=p2;p->bf=0;//仍將P所指向新的根結點,并置其bf值為0}taller=0;} }int InsertAVL(BSTNode * &b,KeyType e,int &taller) {if(b==NULL){b=(BSTNode *)malloc(sizeof(BSTNode));b->key=e;b->lchild=b->rchild=NULL;b->bf=0;taller=1;}else{if(e==b->key){taller=0;return 0;}if(e<b->key){if((InsertAVL(b->lchild,e,taller))==0)return 0;if(taller==1)LeftProcess(b,taller);}else{if((InsertAVL(b->rchild,e,taller))==0)return 0;if(taller==1)RightProcess(b,taller);}}return 1; }void DispBSTree(BSTNode *b) {if(b!=NULL){printf(" %d",b->key);if(b->lchild!=NULL||b->rchild!=NULL){printf("(");DispBSTree(b->lchild);if(b->rchild!=NULL) printf(",");DispBSTree(b->rchild);printf(")");}} }void LeftProcess1(BSTNode * &p,int &taller) {BSTNode *p1,*p2;if(p->bf==1){p->bf=0;taller=1;}else if(p->bf==0){p->bf=-1;taller=0;}else{p1=p->rchild;if(p1->bf=0){p->rchild=p1->lchild;p1->lchild=p;p1->bf=1;p->bf=-1;p=p1;taller=0;}else if(p1->bf==-1){p->rchild=p1->lchild;p1->lchild=p;p->bf=p1->bf=0;p=p1;taller=1;}else{p2=p1->lchild;p1->lchild=p2->rchild;p2->rchild=p1;p->rchild=p2->lchild;p2->lchild=p;if(p2->bf==0){p->bf=0;p1->bf=0;}else if(p2->bf==-1){p->bf=1;p2->bf=0;}else{p->bf=0;p1->bf=-1;}p2->bf=0;p=p2;taller=1;}} }void RightProcess1(BSTNode * &p,int &taller) {BSTNode *p1,*p2;if(p->bf==-1){p->bf=0;taller=-1;}else if(p->bf==0){p->bf=1;taller=0;}else{p1=p->lchild;if(p1->bf==0){p->lchild=p1->rchild;p1->rchild=p;p1->bf=-1;p->bf=1;p=p1;taller=0;}else if(p1->bf==1){p->lchild=p1->rchild;p1->rchild=p;p->bf=p1->bf=0;p=p1;taller=1;}else{p2=p1->rchild;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=0;p1->bf=0;}else{p->bf=0;p1->bf=1;}p2->bf=0;p=p2;taller=1;}} }void Delete2(BSTNode *q,BSTNode * &r,int &taller) {if(r->rchild==NULL){q->key=r->key;q=r;r=r->lchild;free(q);taller=1;}else{Delete2(q,r->rchild,taller);if(taller==1)RightProcess1(r,taller);} }int DeleteAVL(BSTNode * &p,KeyType x,int &taller) {int k;BSTNode *q;if(p==NULL)return 0;else if(x<p->key){k=DeleteAVL(p->lchild,x,taller);if(taller==1)LeftProcess1(p,taller);return k;}else if(x>p->key){k=DeleteAVL(p->rchild,x,taller);if(taller==1)RightProcess1(p,taller);return k;}else if(x>p->key){k=DeleteAVL(p->rchild,x,taller);if(taller==1)RightProcess1(p,taller);return k;}else{q=p;if(p->rchild==NULL){p=p->lchild;free(q);taller=1;}else if(p->lchild==NULL){p=p->rchild;free(q);taller=1;}else{Delete2(q,q->lchild,taller);if(taller==1)LeftProcess1(q,taller);p=q;}return 1;} }int main() {BSTNode *b=NULL;int i,j,k;KeyType a[]={4,9,0,1,8,6,3,5,2,7},n=10;printf("\n");printf("創建一棵AVL樹:\n");for(i=0;i<n;i++){printf(" 第%d步,輸入%d元素:",i+1,a[i]);InsertAVL(b,a[i],j);DispBSTree(b);printf("\n"); }printf("AVL:");DispBSTree(b);printf("\n"); printf("刪除結點:\n");k=8;printf("刪除結點%d:\n",k);DeleteAVL(b,k,j);printf("AVL:");DispBSTree(b);printf("\n"); k=2;printf("刪除結點%d:\n",k);DeleteAVL(b,k,j);printf("AVL:");DispBSTree(b);printf("\n");return 0; }

數據結構源碼筆記(C語言描述)匯總:

數據結構源碼筆記(C語言):英文單詞按字典序排序的基數排序

數據結構源碼筆記(C語言):直接插入排序

數據結構源碼筆記(C語言):直接選擇排序

數據結構源碼筆記(C語言):置換-選擇算法

數據結構源碼筆記(C語言):Huffman樹字符編碼

數據結構源碼筆記(C語言):Josephus問題之順序表

數據結構源碼筆記(C語言):Josephus問題之循環鏈接表

數據結構源碼筆記(C語言):多項式合并

數據結構源碼筆記(C語言):二叉樹之葉子結點旋轉銷毀

數據結構源碼筆記(C語言):哈夫曼樹

數據結構源碼筆記(C語言):集合的位向量表示

數據結構源碼筆記(C語言):鏈接隊列

數據結構源碼筆記(C語言):鏈接棧

數據結構源碼筆記(C語言):線性表的單鏈表示

數據結構源碼筆記(C語言):線性表的順序表示

數據結構源碼筆記(C語言):棧的基本操作

數據結構源碼筆記(C語言):中綴表達式

數據結構源碼筆記(C語言):希爾插入排序

數據結構源碼筆記(C語言):索引文件建立和查找

數據結構源碼筆記(C語言):冒泡排序

數據結構源碼筆記(C語言):快速排序

數據結構源碼筆記(C語言):可變長度字符串的快速排序

數據結構源碼筆記(C語言):基數排序

數據結構源碼筆記(C語言):二路歸并排序

數據結構源碼筆記(C語言):堆排序

數據結構源碼筆記(C語言):二叉樹搜索樹Kruskal

數據結構源碼筆記(C語言):二叉搜索樹Prim

數據結構源碼筆記(C語言):最短路徑弗洛伊德算法

數據結構源碼筆記(C語言):深度、廣度優先生成樹

數據結構源碼筆記(C語言):鄰接矩陣轉化鄰接表

數據結構源碼筆記(C語言):統計字符串中出現的字符及其次數

數據結構源碼筆記(C語言):順序查找

數據結構源碼筆記(C語言):哈希表的相關運算算法

數據結構源碼筆記(C語言):分塊法查找

數據結構源碼筆記(C語言):二分查找

數據結構源碼筆記(C語言):二叉樹遍歷

數據結構源碼筆記(C語言):二叉平衡樹的相關操作算法

數據結構源碼筆記(C語言):二叉排序樹的基本操作算法

數據結構源碼筆記(C語言):B樹的相關運算算法

總結

以上是生活随笔為你收集整理的数据结构源码笔记(C语言):二叉平衡树的相关操作算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。