您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 平衡二叉树(AVL)的查找、插入和删除
平衡二叉树(AVL)查找、插入和删除小组成员:陈静101070009陈丹璐101070006陈娇101070008平衡二叉树的查找、插入和删除第页共38页2目录平衡二叉树(AVL).....................................................................................................................1查找、插入和删除........................................................................................................................1问题描述.........................................................................................................................................2设计说明.........................................................................................................................................3(一)ADT............................................................................................................................3(二)算法思想....................................................................................................................5(三)数据结构.................................................................................................................12(四)程序结构与流程....................................................................................................13运行平台及开发工具.................................................................................................................15I/O格式.......................................................................................................................................15算法复杂度分析.........................................................................................................................18源代码..........................................................................................................................................18小结..............................................................................................................................................37问题描述利用平衡二叉树实现一个动态查找表。平衡二叉树的查找、插入和删除第页共38页3(1)实现动态查找表的三种基本功能:查找、插入和删除。(2)初始时,平衡二叉树为空树,操作界面给出创建、查找、插入和删除和退出五种操作供选择。每种操作均要提示输入关键字。创建时,根据提示输入数据,以-1为输入数据的结束标志,若输入数据重复,则给出已存在相同关键字的提示,并不将其插入到二叉树中。在查找时,如果查找的关键字不存在,则显示不存在查找的关键字,若存在则显示存在要查找的关键字。插入时首先检验原二叉树中是否已存在相同第3页共38页-3-的关键字,若没有则进行插入并输出二叉树,若有则给出已有相同关键字的提醒。删除时首先检验原二叉树中是否存在要删除的关键字,若有则进行删除后并输出二叉树,若没有则给出不存在要删除的关键字的提醒。(3)平衡二叉树的显示采用中序遍历的方法输出,还可以根据输出数据是否有序验证对平衡二叉树的操作是否正确。设计说明(一)ADTADTBalancedBinaryTree{数据对象D:D是具有相同特性的数据元素的集合。各个数据元素均含有类型相同,可唯一标志的数据元素的关键字。数据关系R:数据元素同属一个集合。基本操作P:voidR_Rotate(BSTree&p);初始条件:二叉树存在,且关键字插入到以*p为根的二叉树的左子树的左孩子上;操作结果:对以*p为根的二叉排序树作右旋处理平衡二叉树的查找、插入和删除第页共38页4voidL_Rotate(BSTree&p);初始条件:二叉树存在,且关键字插入到以*p为根的二叉树的右子树的右孩子上;操作结果:对以*p为根的二叉排序树作左旋处理voidLeftBalance(BSTree&T);初始条件:二叉树存在,且关键字插入到T所指节点为根的二叉树的左子树的右孩子上;操作结果:对以指针T所指结点为根的二叉树作左平衡旋转处理voidRightBalance(BSTree&T);初始条件:二叉树存在,且关键字插入到T所指节点为根的二叉树的右子树的左孩子上;操作结果:对以指针T所指结点为根的二叉树作右平衡旋转处理boolInsertAVL(BSTree&T,inte,bool&taller);初始条件:T存在,且e与二叉树的原有关键字不同;操作结果:插入结点e平且平衡化;boolSearchBST(BSTree&T,intkey);初始条件:T存在且元素key与某关键字相同;操作结果:查找元素key是否在树T中voidPrintBST(BSTreeT);初始条件:T存在操作结果:按中序遍历输出二叉树的元素voidCreatBST(BSTree&T);初始条件:T为空操作结果:创建平衡二叉树,(注意:以输入-1为二叉树建立的结束)voidLeftBalance_div(BSTree&p,int&shorter);平衡二叉树的查找、插入和删除第页共38页5初始条件:T存在操作结果:删除结点时左平衡旋转处理voidRightBalance_div(BSTree&p,int&shorter);初始条件:T存在操作结果:删除结点时右平衡旋转处理voidDelete(BSTreeq,BSTree&r,int&shorter);初始条件:T存在且节点删除成功操作结果:删除结点intDeleteAVL(BSTree&p,intx,int&shorter);初始条件:操作结果:平衡二叉树的删除操作}ADTBalancedBinaryTree(二)算法思想1、查找在根指针T所指二叉排序树中递归地查找某关键字等于key的数据元素,若查找成功,则返回指向该数据元素结点的指针,否则返回空指针。如果树T为空,则查找不成功,返回空指针;当树T非空时,如果根指针T所指数据元素的关键字等于key,则查找成功,返回根指针T,否则在左子树中继续查找,若还未找到,则继续在右子树中进行查找,直到找到该数据元素或树T为空为止。平衡二叉树的查找、插入和删除第页共38页6//查找元素key是否在树T中boolSearchBST(BSTree&T,intkey){if(!T)returnfalse;elseif(EQ(key,T-data))returntrue;elseif(LT(key,T-data))returnSearchBST(T-lchild,key);elsereturnSearchBST(T-rchild,key);}2、插入(一)若T为空树,则插入一个数据元素为e的新节点作为T的根节点,树长高,树的深度增加1。(二)若待插入的数据元素e与T的根节点的关键字相同,则不进行插入。(三)若待插入的数据元素e小于根节点的关键字,且在T的左子树上不存在与e相等的数据元素,那么将e插入到T的左子树上。下面就插入到左子树之后,就不同的情况进行处理:①若之前T的根节点的平衡因子为-1,将根节点的平衡因子变为0,T的深度不变;②若之前T的根节点的平衡因子为0,就将根节点的平衡因子变为1,T的深度增加;③若之前的T的根节点的平衡因子为1,那么当其左子树的根节点的平衡因子为1的时候,需要进行单向右旋处理,并且在右旋处理之后,将根节点和其右子树根节点的平衡因子改为0,树的深度不变;当其左子树的根节点的平衡因子为-1的时候,要进行先左后右的双向旋转平衡,并在旋转之后,修改根节点和其左右子树的根节点的平衡因子,树的深度不平衡二叉树的查找、插入和删除第页共38页7变。(四)若待插入的数据元素e大于根节点的关键字,且在T的右子树上不存在与e相等的数据元素,那么将e插入到T的右子树上。下面就插入到右子树之后,就不同的情况进行处理:①若之前T的根节点的平衡因子为1,将根节点的平衡因子变为0,T的深度不变;②若之前T的根节点的平衡因子为0,就将根节点的平衡因子变为1,T的深度增加;③若之前的T的根节点的平衡因子为-1,那么当其右子树的根节点的平衡因子为-1的时候,需要进行单向左旋处理,并且在左旋处理之后,将根节点和其左子树根节点的平衡因子改为0,树的深度不变;当其右子树的根节点的平衡因子为1的时候,要进行先右后左的双向旋转平衡,并在旋转之后,修改根节点和其左右子树的根节点的平衡因子,树的深度不变。//插入结点e,若T中不存在和e相同关键字的结点,则插入一个数据元素为e的新结点,并返回1,否则返回0boolInsertAVL(BSTree&T,inte,bool&taller){if(!T)//插入新结点,树长高,置taller为true{T=(BSTree)malloc(sizeof(BSTNode));T-data=e;T-lchild=T-rchild=NULL;T-bf=EH;taller=true;平衡二叉树的查找、插入和删除第页共38页8}else{if(EQ(e,T-data))//树中已存在和有相同关键字的结点则不再插入{taller=false;printf(已存在相同关键字的结点\n);return0;}if(LT(e,T-data))//应继续在*T的左子树中进行搜索{if(!InsertAVL(T-lchild,e,taller))return0;//未插入if(taller)//已插入到*T的左子树中且左子树长高{switch(T-bf)//检查*T的平衡度{caseLH://原本左子树比右子树高,需要作左平衡处理LeftBalance(T);taller=false;break;caseEH://原本左子树、右子等高,现因左子树增高而使树增高T-bf=LH;平衡二叉树的查找、插入和删除第页共38页9taller=true;break;caseRH://原本右子树比左子树
本文标题:平衡二叉树(AVL)的查找、插入和删除
链接地址:https://www.777doc.com/doc-1900383 .html