平衡二叉树的生成过程_第1页
平衡二叉树的生成过程_第2页
平衡二叉树的生成过程_第3页
平衡二叉树的生成过程_第4页
平衡二叉树的生成过程_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

二叉排序树变成平衡二叉树对于二叉查找树,尽管查找、插入及删除操作的平均运行时间为O(logn),但是它们的最差运行时间都是O(n),原因在于对树的形状没有限制。平衡二叉树又称为AVL树,它或者是一棵空树,或者是有下列性质的二叉树:它的左子树和右子树都是平衡二叉树,且左右子树的深度之差的绝对值不超过1。二叉树的的平衡因子BF为:该结点的左子树的深度减去它的右子树的深度,则平衡二叉树的所有结点的平衡因子为只可能是:-1、0和1一棵好的平衡二叉树的特征:(1)保证有n个结点的树的高度为O(logn)(2)容易维护,也就是说,在做数据项的插入或删除操作时,为平衡树所做的一些辅助操作时间开销为O(1)一、平衡二叉树的构造在一棵二叉查找树中插入结点后,调整其为平衡二叉树。若向平衡二叉树中插入一个新结点后破坏了平衡二叉树的平衡性。首先要找出插入新结点后失去平衡的最小子树根结点的指针。然后再调整这个子树中有关结点之间的链接关系,使之成为新的平衡子树。当失去平衡的最小子树被调整为平衡子树后,原有其他所有不平衡子树无需调整,整个二叉排序树就又成为一棵平衡二叉树1.调整方法(1)插入点位置必须满足二叉查找树的性质,即任意一棵子树的左结点都小于根结点,右结点大于根结点(2)找出插入结点后不平衡的最小二叉树进行调整,如果是整个树不平衡,才进行整个树的调整。2.调整方式(1)LL型LL型:插入位置为左子树的左结点,进行向右旋转(LL表示的是在做子树的左结点进行插入)由于在A的左孩子B的左子树上插入结点F,使A的平衡因子由1变为2,成为不平衡的最小二叉树根结点。此时A结点顺时针右旋转,旋转过程中遵循“旋转优先”的规则,A结点替换D结点成为B结点的右子树,D结点成为A结点的左孩子。(2)RR型RR型:插入位置为右子树的右孩子,进行向左旋转由于在A的右子树C的右子树插入了结点F,A的平衡因子由-1变为-2,成为不平衡的最小二叉树根结点。此时,A结点逆时针左旋转,遵循“旋转优先”的规则,A结点替换D结点成为C的左子树,D结点成为A的右子树。(3)LR型LR型:插入位置为左子树的右孩子,要进行两次旋转,先左旋转,再右旋转;第一次最小不平衡子树的根结点先不动,调整插入结点所在的子树,调整后的树变成LL型树,第二次再调整最小不平衡子树(根据LL型的调整规则,调整为平衡二叉树)。由于在A的左子树B的右子树上插入了结点F,A的平衡因子由1变为了2,成为不平衡的最小二叉树根结点。第一次旋转A结点不动,先将B的右子树的根结点D向左上旋转提升到B结点的位置,然后再把该D结点向右上旋转提升到A结点的位置。(4)RL型RL型:插入位置为右子树的左孩子,进行两次调整,先右旋转调整为RR型,再左旋转,从RR型调整到平衡二叉树;处理情况与LR类似。总结:RR型和LL型插入导致的树失去平衡,只需要做一次旋转调整即可。而RL型和LR型插入导致的结点失去平衡,要调整两次。对于RL/LR的调整策略是:第一次调整,最小不平衡子树的根结点先不动,调整插入结点所在的子树(这个子树是指最小不平衡结点的一颗子树,且这棵子树是插入结点的子树)为RR型或者LL型,第二次再调整最小不平衡子树(调整策略要么是RR型要么是LL型)。#include<iostream>

{

TreeNode*p;

p=r->lchild;

LL_Rotate(p);//最小失衡树根结点的左子树根结点进行左旋转

r->lchild=p;//更新最小失衡树根结点的左孩子

RR_Rotate(r);//最小失衡树根结点进行右旋转

}

voidAVLTree::LeftBalance(TreeNode*&T)//左平衡处理

{//初始条件:原来平衡的二叉排序树T的左子树比右子树高(T->bf=1)

//又在左子树中插入了结点,并导致左子树更高,破坏了树T的平衡性

//操作结果:对不平衡的树T作左平衡旋转处理,使树T的重心右移实现新的平衡

TreeNode*lc,*rd;

lc=T->lchild;//lc指向T的左孩子结点

switch(lc->BF)//检查T左子树的平衡因子

{

caseLH://新结点插入在T的左孩子的左子树上,导致左子树的平衡因子为左高,进行右旋转处理

T->BF=lc->BF=EH;//旋转后,原根结点和左孩子结点平衡因子都为0

RR_Rotate(T);//右旋转处理

break;

caseRH://新结点插入在T的左孩子的右子树上,导致左子树的平衡因子为右高,进行LR处理

rd=lc->rchild;

switch(rd->BF)

{

caseLH://新结点插入在T的左孩子的右子树的左子树上

T->BF=RH;//旋转后,原根结点的平衡因子为右高

lc->BF=EH;//旋转后,原根结点的左孩子结点平衡因子为等高

break;

caseEH://新结点插入到T的左孩子的右孩子(叶子)

T->BF=lc->BF=EH;//旋转后,原根和左孩子结点的平衡因子都为等高

break;

caseRH://新结点插入在T的左孩子的右子树的右子树上

T->BF=EH;//旋转后,原根结点的平衡因子为等高

lc->BF=LH;//旋转后,原根结点的左孩子结点平衡因子为左高

}

rd->BF=EH;//旋转后的新结点的平衡因子为等高//双旋转处理

LL_Rotate(T->lchild);//对T的左子树左旋转处理

RR_Rotate(T);//对T作右旋转处理}

}voidAVLTree::RightBalance(TreeNode*&T)//右平衡处理

{//初始条件:原来平衡二叉排序树T的右子树比左子树高,又在右子树中插入结点,导致右子树更高

//操作结果:对不平衡的树T作右平衡旋转处理

TreeNode*rc,*ld;

rc=T->rchild;

switch(rc->BF)

{

caseRH://新结点插入在T的右孩子的右子树上,导致右子平衡因子为右高,进行左旋转处理

T->BF=rc->BF=EH;//旋转后,原根结点和右孩子结点的平衡因子均为0

LL_Rotate(T);

break;

caseLH://新结点插入在T的右孩子的左子树上,导致右子树的平衡因子为左高,进行双旋处理

ld=rc->lchild;

switch(ld->BF)

{

caseRH://新结点插入在T的右孩子的左子树的右子树上

T->BF=LH;//旋转后,原根结点的平衡因子为左高

rc->BF=EH;//旋转后,原根结点的右孩子结点平衡因子为等高

break;

caseEH://新结点插入到T的右孩子的左孩子(叶子)

T->BF=rc->BF=EH;//旋转后,原根和右孩子结点的平衡因子等高

break;

caseLH://新结点插入到T的右孩子的左子树的左子树

T->BF=EH;//旋转后,原根结点的平衡因子等高

rc->BF=RH;//旋转后,原根结点的右孩子结点的平衡因子为右高

}

ld->BF=EH;//旋转后的新根结点的平衡因子为等高//双旋转处理

RR_Rotate(T->rchild);//对T的右子树作右旋转处理

LL_Rotate(T);//对T作左旋转处理

}

}

intmain()

{

constchar*file="data.txt";

AVLTreeAVL=AVLTree();

TreeNode*root=NULL;

intdata;

ifstreamfin;

fin.open(file);

if(fin.is_open(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论