二叉平衡树的基本操作(完整代码)
2015-11-04 14:37
274 查看
首先二叉平衡树的基本原理你要懂,这里只提供全部代码和相应的说明。
以上是最基本的代码,是看《大话数据结构》时根据书上代码编写的,适合最最基础的人看,有问题可以评论,同是菜鸟,我们一起讨论嘛~
[code]#include<stdio.h> #include<stdlib.h> #define LH +1 //左树比右树高 #define EH 0 //等高 #define RH -1 //右树高 #define TURE 1 #define FALSE 0 typedef struct BiTNode { int data; int bf; struct BiTNode *lchild, *rchild; }BiTNode, *BiTree; //右旋 void R_Rotate(BiTree *p) { BiTree L; L=(*p)->lchild; //*p的左子树赋值给L (*p)->lchild=L->rchild; //L右字数挂到*p的左子树上 L->rchild=(*p); (*p)=L; //用L替代原来位置 } //左旋 void L_Rotate(BiTree *p) { BiTree R; R=(*p)->rchild; (*p)->rchild=R->lchild; R->lchild=(*p); *p=R; } //左平衡旋转 void LeftBalance(BiTree *T) //左子树的高度大于右子树的高度 { BiTree L,Lr; L=(*T)->lchild; //将其左子树赋值给L switch(L->bf) //判断L的平衡度 { case LH: //与*T相同,平衡度归零,直接右旋 (*T)->bf=L->bf=EH; R_Rotate(T); break; case RH: //与*T不同,去判断L的右子树(会替代*T的位置) Lr=L->rchild; switch(Lr->bf) { case LH: (*T)->bf=RH; L->bf=EH; break; case EH: (*T)->bf=L->bf=EH; break; case RH: (*T)->bf=EH; L->bf=LH; break; } Lr->bf=EH; L_Rotate(&(*T)->lchild); R_Rotate(T); } } //右平衡旋转 void RightBalance(BiTree *T) //同理 { BiTree R,Rr; R=(*T)->rchild; switch(R->bf) { case RH: (*T)->bf=R->bf=EH; L_Rotate(T); break; case LH: Rr=R->lchild; switch(Rr->bf) { case RH: (*T)->bf=LH; R->bf=EH; break; case EH: (*T)->bf=R->bf=EH; break; case LH: (*T)->bf=EH; R->bf=RH; break; } Rr->bf=EH; R_Rotate(&(*T)->rchild); L_Rotate(T); } } //插入 //布尔变量taller用来反应树长高与否 int Insert***L(BiTree *T,int e,int *taller) { if(!*T) //若*T为空,说明树中没有与要插入元素相等的树,构造新节点 { *T=(BiTree)malloc(sizeof(BiTNode)); (*T)->data=e; (*T)->lchild=(*T)->rchild=NULL; (*T)->bf=EH; *taller=TURE; //构造新节点后,树长高了 } else { if(e==(*T)->data) //树中已有待插元素,树没长高,返回0 { *taller=FALSE; return FALSE; } if(e<(*T)->data) //递归部分:小于就遍历左子树继续 { if(!(Insert***L(&(*T)->lchild,e,taller))) //去插入左子树,未插入则返回0 return FALSE; if(*taller) //已插入,树长高 { switch((*T)->bf) //根据T原来的平衡度做判断 { case LH: //左大于右,插入后,左平衡处理,树未长高 LeftBalance(T); *taller=FALSE; break; case EH: //相等,插入后左大于右,树长高 (*T)->bf=LH; *taller=TURE; break; case RH: //右大于左,插入后,相等,树未长高 (*T)->bf=EH; *taller=FALSE; break; } } } else { if(!(Insert***L(&(*T)->rchild,e,taller))) //插入右子树时的递归部分,同理 return FALSE; if(*taller) { switch((*T)->bf) { case RH: RightBalance(T); *taller=FALSE; break; case EH: (*T)->bf=RH; *taller=TURE; break; case LH: (*T)->bf=EH; *taller=FALSE; break; } } } } } //中序输出 void InOrder(BiTree T) { if(T) { InOrder(T->lchild); printf("%d ",T->data); InOrder(T->rchild); } else return; } void main() { int i; int a[10]={3,2,1,4,5,6,7,10,9,8}; BiTree T=NULL; int taller; for(i=0;i<10;i++) { Insert***L(&T,a[i],&taller); } InOrder(T); }
以上是最基本的代码,是看《大话数据结构》时根据书上代码编写的,适合最最基础的人看,有问题可以评论,同是菜鸟,我们一起讨论嘛~
相关文章推荐
- ASP.NET Web API 使用Swagger生成在线帮助测试文档
- C++11内存管理速记
- 【转】c++中placement new操作符
- uva111
- 设置Java导出Excel表头
- Java中通过JDBC操作MySQL数据库
- python3.3+selenium
- 字符串转换成指定类型
- 几个比较好的代码托管地址
- NotRxJava懒人专用指南
- python模块以及导入出现ImportError: No module named 'xxx'问题
- Java基础之String中equals,声明方式,等大总结
- python爬虫初体验(百度贴吧)
- python问题之requests\packages\urllib3\util\ssl_.py:100: InsecurePlatformWarning
- Python的@修饰符和装饰器
- C语言结构体内存对齐
- 2015-11-04 报表 (asp.net 部分)
- php三元运算符 ? :
- PHP使用eval()函数的注意事项
- ASP.NET Web Api 2 接口API文档美化之Swagger