平衡二叉树暂记

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

平衡二叉树

两个特点:
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不变顺序放置)

### 数据库寻址机制的实现原理 数据库的寻址机制是指通过某种方法快速定位所需的数据记录的过程。这一过程通常依赖于索引结构以及底层存储引擎的设计来完成高效的查询操作。 #### 1. 索引的作用及其常见类型 为了提高数据检索效率,数据库引入了索引的概念。索引是一种特殊的数据结构,用于加速对特定列上值的查找。常见的索引类型包括 B+ 树、哈希表和位图索引等[^4]。 - **B+ 树索引** 在大多数关系型数据库中,B+ 树是最常用的索引形式之一。它具有良好的平衡性和顺序访问性能,适合范围查询和精确匹配。相比普通的二叉树,B+ 树能够更好地应对连续插入新数据的情况,避免因频繁调整而导致性能下降。 - **哈希索引** 哈希索引适用于等值查询场景。其基本思想是通过对键值应用哈希函数计算出对应的地址位置,从而直接跳转至目标数据页。然而,由于缺乏有序性支持,这类索引无法处理涉及区间条件的操作[^2]。 - **位图索引** 当某一字段存在大量重复值时可考虑采用位图索引方案。该技术会为每种可能取值创建一份按行号排列的布尔数组表示是否存在对应关系。尽管占用空间较小且便于执行并集/交集运算,但在高基数属性上的表现往往不如其他两种方式理想[^3]。 #### 2. 存储层面对物理地址映射的支持 除了逻辑层面构建起来的各种辅助工具外,实际读取过程中还需要依靠具体的文件系统配合才能最终获取到磁盘上的真实内容片段。以下是几个关键环节: - **缓冲池管理器(Buffer Pool Manager)** 考虑到硬盘I/O成本较高,现代RDBMS普遍实现了基于内存缓存策略优化后的版本控制体系——即每当请求到来之后先尝试从工作区内寻找满足需求的对象;只有当确实找不到才触发外部加载动作[^1]。 - **页面分配算法(Page Replacement Algorithm)** 鉴于可用RAM容量有限制约束条件下不可能无限扩张暂存区规模大小,因此有必要制定合理的淘汰规则决定哪些不活跃项应该被驱逐出去以便腾挪更多资源服务于后续调用者的需求。 - **WAL协议(Write-Ahead Logging Mechanism)** Write-ahead logging 是一种确保持久化安全性的通用做法。具体而言就是在真正更改永久副本前先把变动信息记录下来形成预写日志(Write Ahead Logs),这样即使发生意外中断也能依据先前留下的线索重新构造丢失部分的信息。 综上所述,整个流程涵盖了多层次协作共同作用的结果:一方面借助精心挑选出来的高效检索手段缩小候选集合范围;另一方面则依托稳健可靠的硬件交互接口保障每一次传输都能顺利完成使命。 ```sql -- 创建带有主键索引的表格实例演示 CREATE TABLE example_table ( id INT PRIMARY KEY, -- 自动成为聚集索引的关键字 name VARCHAR(50), age SMALLINT, INDEX idx_name (name) -- 对'name'字段单独设立非聚簇次级索引 ); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值