平衡二叉树的插入与生成

平衡二叉树的插入与生成

ID:38627557

大小:54.00 KB

页数:9页

时间:2019-06-16

平衡二叉树的插入与生成_第1页
平衡二叉树的插入与生成_第2页
平衡二叉树的插入与生成_第3页
平衡二叉树的插入与生成_第4页
平衡二叉树的插入与生成_第5页
资源描述:

《平衡二叉树的插入与生成》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、#include#includetypedefintKeyType;/*定义关键字类型*/typedefcharInfoType;typedefstructnode/*记录类型*/{KeyTypekey;/*关键字项*/intbf;/*平衡因子*/InfoTypedata;/*其他数据域*/structnode*lchild,*rchild;/*左右孩子指针*/}BSTNode;voidLeftProcess(BSTNode**p,int*taller)/*对以

2、指针p所指结点为根的二叉树作左平衡旋转处理,本算法结束时,指针p指向新的根结点*/{BSTNode*p1,*p2;if((*p)->bf==0)/*原本左、右子树等高,现因左子树增高而使树增高*/{(*p)->bf=1;*taller=1;}elseif((*p)->bf==-1)/*原本右子树比左子树高,现左、右子树等高*/{(*p)->bf=0;*taller=0;}else/*原本左子树比右子树高,需作左子树的平衡处理*/{p1=(*p)->lchild;/*p指向*p的左子树根结点*/if(

3、p1->bf==1)/*新结点插入在*b的左孩子的左子树上,要作LL调整*/{(*p)->lchild=p1->rchild;p1->rchild=*p;(*p)->bf=p1->bf=0;*p=p1;}elseif(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)/*

4、新结点插在*p2处作为叶子结点的情况*/(*p)->bf=p1->bf=0;elseif(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;}}voidRightProcess(BSTNode**p,int*taller)/*对以指针p所指结点为根的二叉

5、树作右平衡旋转处理,本算法结束时,指针p指向新的根结点*/{BSTNode*p1,*p2;if((*p)->bf==0)/*原本左、右子树等高,现因右子树增高而使树增高*/{(*p)->bf=-1;*taller=1;}elseif((*p)->bf==1)/*原本左子树比右子树高,现左、右子树等高*/{(*p)->bf=0;*taller=0;}else/*原本右子树比左子树高,需作右子树的平衡处理*/{p1=(*p)->rchild;/*p指向*p的右子树根结点*/if(p1->bf==-1)/

6、*新结点插入在*b的右孩子的右子树上,要作RR调整*/{(*p)->rchild=p1->lchild;p1->lchild=*p;(*p)->bf=p1->bf=0;*p=p1;}elseif(p1->bf==1)/*新结点插入在*p的右孩子的左子树上,要作RL调整*/{p2=p1->lchild;p1->lchild=p2->rchild;p2->rchild=p1;(*p)->rchild=p2->lchild;p2->lchild=*p;if(p2->bf==0)/*新结点插在*p2处作为叶

7、子结点的情况*/(*p)->bf=p1->bf=0;elseif(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;}}intInsertAVL(BSTNode**b,KeyTypee,int*taller)/*若在平衡的二叉排序树b中不存在和e有相同

8、关键字的结点,则插入一个数据元素为e的新结点,并返回1,否则返回0。若因插入而使二叉排序树失去平衡,则作平衡旋转处理,布尔变量taller反映b长高与否*/{if(*b==NULL)/*原为空树,插入新结点,树“长高”,置taller为1*/{*b=(BSTNode*)malloc(sizeof(BSTNode));(*b)->key=e;(*b)->lchild=(*b)->rchild=NULL;(*b)->bf=0;*taller=1;}else{if(e==(

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。