平衡二叉树的建立,查找,插入,调整,遍历的C语言实现
来源:互联网 发布:mp5 淘宝 编辑:程序博客网 时间:2024/05/08 03:31
/*本程序实现了二叉树的建立,平衡,插入,查找,遍历 由于平衡二叉树的删除非常复杂,这里就不做讨论了。*/#include<stdio.h>#include<stdlib.h>#define LH 1#define EH 0#define RH -1typedef struct BinaryTree//定义二叉树的结构{int data;//所要存储的数据struct BinaryTree *lchild;//左孩子struct BinaryTree *rchild;//右孩子int bf;//平衡因子int times;//同一个数据出现的次数}BT,*pBT;void R_router(pBT *T)//右旋转{pBT lc=(*T)->lchild;(*T)->lchild=lc->rchild;lc->rchild=(*T);(*T)=lc;}void L_router(pBT *T)//左旋转{pBT rc=(*T)->rchild;(*T)->rchild=rc->lchild;rc->lchild=(*T);(*T)=rc;}void LBalance(pBT *T)//左边调节{pBT lc=(*T)->lchild;pBT lrc=(lc)->rchild;switch(lc->bf){case EH: { lc->bf=EH; (*T)->bf=EH; R_router(T); } break;case RH: { switch(lrc->bf){case LH:{lc->bf=EH;(*T)->bf=RH;lrc->bf=EH;}break;case EH:{lc->bf=EH;(*T)->bf=EH;lrc->bf=EH;}break;case RH: {lc->bf=LH;(*T)->bf=EH;lrc->bf=EH; }break; }L_router(&(*T)->lchild);//以左孩子为中心,先做一次左旋转R_router(T); //再以根节点为中心,做一次右旋转 }}}void RBalance(pBT *T)//右边调节{pBT rc=(*T)->rchild;pBT rlc=rc->lchild;switch(rc->bf){case RH: { rc->bf=EH; (*T)->bf=EH; L_router(T); }break;case LH: { switch(rlc->bf) { case LH: {rlc->bf=EH;(*T)->bf=EH;rc->bf=RH; }break; case EH: {rlc->bf=EH;(*T)->bf=EH;rc->bf=EH; }break; case RH: { rlc->bf=EH;(*T)->bf=LH;rc->bf=EH; }break; } R_router(&(*T)->rchild);//以右孩子为中心,先做一次右旋转 L_router(T);//再以根节点为中心,做一次右旋转 }}}int insert(pBT *T,int data,int *taller)//插入节点{if((*T)==NULL)//当前节点为空,则插入{*taller=1;(*T)=(pBT)malloc(sizeof(BT));(*T)->bf=0;(*T)->data=data;(*T)->lchild=(*T)->rchild=NULL;(*T)->times=1;return 1;}if((*T)!=NULL){ if((*T)->data<data)//往右边插入{if(insert(&(*T)->rchild,data,taller))//如果树变高了,{switch((*T)->bf){case LH: //原来左边高,往右插入后,两边相等{*taller=0;(*T)->bf=EH;}break;case EH://原来相等,往右插入后,右子树高{*taller=1;(*T)->bf=RH;}break;case RH://原来为1,插入后变的更高,所以要调节{*taller=0;RBalance(T);}break;}}}else if((*T)->data>data)//往左边插入{if(insert(&(*T)->lchild,data,taller)){switch((*T)->bf){case LH: //原来为1,插入后变的更高,所以要调节{LBalance(T);*taller=0;}break;case EH://原来相等,插入后,左子树变高{*taller=1;(*T)->bf=LH;}break;case RH:{//原来右子树高,插入后,左右平衡*taller=0;(*T)->bf=EH;}break;}}}else if((*T)->data==data)//如果插入的数已经存在,则出现的次数+1,然后树高不变{(*T)->times++;*taller=0;}}return *taller;}int travel(pBT T)//中序遍历{if(T){travel(T->lchild);printf("%d ",T->data);travel(T->rchild);}}int find(int target,pBT T){int i=0;if(T){if(T->data>target)i=find(target,T->lchild);else if(T->data<target)i=find(target,T->rchild);else if(T->data==target)return 1;}return i;}int main(){int *taller,i=0,k=0;BT t,*T;pBT *P=NULL;int a[12]={0,2,1,4,5,6,7,8,9,11,15,16};taller=&k;T=NULL;P=&T;for(i=0;i<12;i++){insert(P,a[i],taller);}travel((*P));i=find(4,(*P));if(i==0)printf("\n\n没有出现4\n\n");elseprintf("\n\n出现了4\n\n");}
0 0
- 平衡二叉树的建立,查找,插入,调整,遍历的C语言实现
- 平衡二叉树(遍历,插入,删除)的C实现
- 平衡二叉树的 插入 删除 查找 等功能c语言实现 数据结构
- 平衡二叉树的C语言实现(创建、插入、查找、删除、旋转)【数据结构】
- 平衡二叉树的插入C语言
- 顺序二叉树的建立、查找、删除、插入、替换、遍历
- c语言实现线性表的建立,初始化,插入,删除,查找,遍历以及时间复杂度分析
- 二叉查找树的建立,遍历,查找
- c语言实现二叉树(BiNodeTree)的建立与先序遍历,中序遍历
- 用c语言编程实现二叉树的建立和遍历二叉树
- 二叉查找树的查找、插入、删除、释放等基本操作的实现(C语言)
- C语言实现二叉查找树(搜索树)的创建,插入,查找,删除
- 二叉树的链式实现(插入,查找,遍历,删除)
- 平衡二叉树结点的插入和调整
- 平衡二叉查找树(AVL)的查找、插入、删除
- 平衡二叉查找树(AVL)的查找,插入,删除
- java实现平衡二叉树的建立
- 二叉树的建立,遍历查找
- hdu 4915 Parenthese sequence
- Ubuntu 12.04更新源
- HDU 4920(杭电多校训练#5 1010 题) Matrix multiplication(不知道该挂个什么帽子。。。)
- VC单例运行
- 解决WIN7下Sublime运行python代码出现的UnicodeEncodeError错误
- 平衡二叉树的建立,查找,插入,调整,遍历的C语言实现
- 视频的码率、帧率、分辨率
- HDU 1232 畅通工程(基础并查集)
- 关于Google无法访问的最简单的解决办法
- 短文本(微博)情感分析
- 记录自己最近的工作状态
- 6个变态的C语言Hello World程序 之 雷人的程序语言
- Unable to compile class for JSP 问题解决方法
- [编程之美] PSet2.13 子数组的最大乘积