生活随笔
收集整理的這篇文章主要介紹了
数据结构源码笔记(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
)
{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
;if(p1
->bf
==1){p
->lchild
=p1
->rchild
;p1
->rchild
=p
;p
->bf
=p1
->bf
=0;p
=p1
;}else if(p1
->bf
==-1){p2
=p1
->rchild
;p1
->rchild
=p2
->lchild
;p2
->lchild
=p1
;p
->lchild
=p2
->rchild
;p2
->rchild
=p
;if(p2
->bf
==0)p
->bf
=p1
->bf
=0;else if(p2
->bf
==1){p1
->bf
=0;p
->bf
=-1;}else {p1
->bf
=1;p
->bf
=0;}p
=p2
;p
->bf
=0;}taller
=0;}
}void RightProcess(BSTNode
*&p
,int &taller
)
{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){p
->rchild
=p1
->lchild
;p1
->lchild
=p
;p
->bf
=p1
->bf
=0; p
=p1
;} else if(p1
->bf
==1){p2
=p1
->lchild
;p1
->lchild
=p2
->rchild
;p2
->rchild
=p1
;p
->rchild
=p2
->lchild
;p2
->lchild
=p
;if(p2
->bf
==0)p
->bf
=p1
->bf
=0;else if(p2
->bf
==-1){p1
->bf
=0;p
->bf
=1;}else {p1
->bf
=-1;p
->bf
=0;}p
=p2
;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语言):二叉平衡树的相关操作算法的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。