平衡二叉树暂记

本文详细介绍了平衡二叉排序树的概念,特别是其两大特性:左右子树深度差不超过1以及子树也保持平衡。文章通过示例展示了RR、LL、LR旋转操作,用于在插入元素后维护树的平衡,确保搜索效率。同时,提供了具体的旋转函数实现,如RR_rotate、LL_rotate和LR_rotate,并给出了示例数据(10,20,30,90,50)的处理策略,强调了调整过程中对中间节点的处理和顺序的重要性。
摘要由CSDN通过智能技术生成

二叉排序树主要解决的是删除中的子节点的去向的问题

平衡二叉树

两个特点:
1.左右子树的深度的差的绝对值不超过1
2.左右子树也是平衡二叉树

BF(BlanceFactor)=左-右(BF-)

二叉树因插入导致平衡破坏的调整(不更改中序遍历的结果)

RR:对B逆时针旋转
在这里插入图片描述
在这里插入图片描述

LL:同理

LR:
插入前
在这里插入图片描述
在这里插入图片描述
先对B及其右子树转成LL
在这里插入图片描述
再使用LL的顺时针:
在这里插入图片描述
调整后:
在这里插入图片描述
在这里插入图片描述
绘图软件

例题:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

void RR_rotate(BBSTNode *a)//只需要传入关键节点a
{ BBSTNode *b;
  b=a->Rchild;//a的右子树 
  a->Rchild=b->Lchild;//最终a的右子树的左子树变为a的右子树
  b->Lchild=a;
  
  a->Bfactor =b-->Bfactor=0;
  a=b;
}
void LL_rotate(BBATNode *a)
{ BBATNode *b;
  b=a->Lchild;a->Lchild=b->Rchild;
  b->Rchild=a;
  a->Bfactor =b-->Bfactor=0;a=b;
}

在这里插入图片描述

在这里插入图片描述

void LR_rotate(BBATNode *a)
{ BBATNode *b,*c;
  b=a->Lchild;c=b->Rchild;/*初始化*/
  a->Lchild=c->Rchild;  b->Rchild=c->Lchild;
  c->lchild=b;c->Rchild=a;
  if(c->Bfactor==1)
  {
  a->Bfactor=-1;b->Bfactor=0;
  }
  else if(c->Bfactor==0)
  a->Bfactor=b->Bfactor=0;
  else{a->Bfactor=0;b->Bfactor=1;}
  
}
void LR_rotate(BBATNode *a)
{ BBATNode *b,*c;
  b=a->Lchild;c=b->Rchild;/*初始化*/
  a->Lchild=c->Rchild;  b->Rchild=c->Lchild;
  c->lchild=b;c->Rchild=a;
  if(c->Bfactor==1)
  {
  a->Bfactor=-1;b->Bfactor=0;
  }
  else if(c->Bfactor==0)
  a->Bfactor=b->Bfactor=0;
  else{a->Bfactor=0;b->Bfactor=1;}
  
}

10,20,30,90,50

在这里插入图片描述

当然对于以上的含有数字的可先关注不平衡的三个节点,将三个节点的顺序排好,两边不用管,中间的根据数值进行放置(RR类要改变顺序,RL不变顺序放置)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值