二叉搜索树详讲

目录

🌟1.平衡二叉树 的定义

🌟2. 为什么使用「平衡二叉树」

判断「平衡二叉树」

🌟3.平衡因子 

3.1 平衡因子 BF

3.2 最小不平衡子树

🌟4. 二种旋转方式 

4.1 LL 型失衡「右旋」

4.2 RR 型失衡「左旋」

4.3 LR 型

4.4 RL 型

🌟5.实例

🌟6.完结


Blessing !  

(最新更新时间——2025.2.17)

🌟1.平衡二叉树 的定义

平衡二叉树定义:任意节点的子树的高度差都小于等于 1


🌟2. 为什么使用「平衡二叉树」

二叉树能提高查询的效率 O(logn),但是当你插入 {1,2,3,4,5,6} 这种数据的时候,你的二叉树就像一个「链表」一样,搜索效率变为 O(n)


于是提出了「平衡二叉树」(AVL) 。

于是插入{1,2,3,4,5,6} 这种数据结果如下图所示:

有人思考了说->:这不就是二叉搜索树吗?

没错,这确实是二叉搜索树,但是它是在二叉排序树的基础上进化的


因此,我们引出判断AVL树的规则

判断「平衡二叉树」

判断「平衡二叉树」的 2 个条件:

  • 1. 是「二叉排序树」
  • 2. 任何一个节点的左子树或者右子树都是「平衡二叉树」(左右高度差小于等于 1)

(1)下图不是「平衡二叉树」因为它不是「二叉排序树」违反第 1 条件

(2)下图不是「平衡二叉树」因为有节点子树高度差大于 1 违法第 2 条件

(3)下图是「平衡二叉树」因为符合 1、2 条件


🌟3.平衡因子 

3.1 平衡因子 BF

定义:左子树和右子树高度差

计算:左子树高度 - 右子树高度的值

别名:简称 BF(Balance Factor 而不是 Boy Friend)

一般来说 BF 的绝对值大于 1,,平衡树二叉树就失衡,需要「旋转」纠正

(旋转后面讲)

3.2 最小不平衡子树

距离插入节点最近的,并且 BF 的绝对值大于 1 的节点为根节点的子树。

「旋转」纠正只需要纠正「最小不平衡子树」即可

 例子如下图所示:(这里看不懂也没关系,看后面的)


🌟4. 二种旋转方式 

2 种「旋转」方式:

  1. 左旋
    • 让旧根节点为新根节点的左子树
    • 让新根节点的左子树(如果存在)为旧根节点的右子树
  2. 右旋:
    • 让旧根节点为新根节点的右子树
    • 让新根节点的右子树(如果存在)为旧根节点的左子树

4 种「旋转」纠正类型:

  1. LL 型:插入左孩子的左子树,右旋
  2. RR 型:插入右孩子的右子树,左旋
  3. LR 型:插入左孩子的右子树,先左旋,再右旋

  4. RL 型:插入右孩子的左子树,先右旋,再左旋


4.1 LL 型失衡「右旋」

第三个节点「1」插入的 时候,BF(3) = 2,BF(2) = 1 LL 型失衡,右旋,根节点顺时针旋转

(1)最小不平衡子树「右旋」

右旋的做法->:

旧根节点(节点 3)为新根节点(节点 2)的右子树
新根节点的 右子树(如果存在)为旧根节点的左子树


4.2 RR 型失衡「左旋」

第三个节点「3」插入的 时候,BF(1)=-2 BF(2)=-1RR 型失衡,左旋,根节点逆时针旋转

(1)最小不平衡子树【左旋】

左旋的做法->:

  • 旧根节点(节点 1)为新根节点(节点 2)的左子树
  • 新根节点的左子树(如果存在)为旧根节点的右子树


4.3 LR 型

第三个节点「3」插入的 时候,BF(3)=2 BF(1)=-1 LR 型失衡,先「左旋」再「右旋」

(1)最小不平衡子树左子树 {2,1} 先左旋

左旋的做法->:

  • 旧根节点(节点 1)为新根节点(节点 2)的左子树
  • 新根节点的左子树(如果存在)为旧根节点的右子树

(2)最小不平衡子树 {3,2,1} 再右旋

右旋的做法->:

  • 旧根节点(节点 3)为新根节点(节点 2)的右子树
  • 新根节点的 右子树(如果存在)为旧根节点的左子树


4.4 RL 型

第三个节点「1」插入的 时候,BF(1)=-2 BF(3)=1 RL 型失衡,先「右旋」再「左旋」


(1)最小不平衡子树根节点右子树{3,2}先右旋

右旋的做法->:

  • 旧根节点(节点 3)为新根节点(节点 2)的右子树
  • 新根节点的 右子树(如果存在)为旧根节点的左子树


(2)最小不平衡子树 {1,2,3} 再左旋(L)

左旋的做法->:

  • 旧根节点(节点 1)为新根节点(节点 2)的左子树
  • 新根节点的左子树(如果存在)为旧根节点的右子树


🌟5.实例

接下来我们以 {3,2,1,4,5,6,7,10,9,8} 为实例练习刚刚的 4 种插入方式

(1)依次插入 3、2、1 插入第三个点 1 的时候 BF(3)=2 BF(2)=1LL 型失衡

对最小不平衡树 {3,2,1}进行「右旋」

右旋:

  • 旧根节点(节点 3)为新根节点(节点 2)的右子树
  • 新根节点(节点 2)的右子树(这里没有右子树)为旧根节点的左子树


(2)依次插入 4 ,5 插入 5 点的时候 BF(3) = -2 BF(4)=-1RR 型失衡

对最小不平衡树 {3,4,5} 进行「左旋」

左旋:

  • 旧根节点(节点 3)为新根节点(节点 4)的左子树
  • 新根节点(节点 4)的左子树(这里没有左子树)为旧根节点的右子树


(3)插入 4 ,5 插入 5 点的时候 BF(2)=-2 BF(4)=-1 ,RR 型失衡 对最小不平衡树进行「左旋」

左旋:

  • 旧根节点(节点 2)为新根节点(节点 4)的左子树
  • 新根节点(节点 4)的 左子树(节点 3)为旧根节点的右子树

新根节点(节点 4)的左子树(节点 3)为旧根节点的右子树


(4)插入 7 节点的时候 BF(5)=-2, BF(6)=-1 ,RR 型失衡,对最小不平衡树 进行「左旋」

左旋:

  • 旧根节点(节点 5)为新根节点(节点 6)的左子树
  • 新根节点的左子树(这里没有)为旧根节点的右子树


(5)依次插入 10 ,9 。插入 9 点的时候 BF(10) = 1,BF(7) = -2 ,RL 型失衡,对先「右旋」再「左旋」

右子树先「右旋」

最小不平衡子树的右子树 {10,9} 先右旋:

  • 旧根节点(节点 10)为新根节点(节点 9)的右子树
  • 新根节点(节点 9)的右子树(这里没有右子树)为旧根节点的左子树

最小不平衡子树再左旋:

  • 旧根节点(节点 7)为新根节点(节点 9)的左子树
  • 新根节点(节点 9)的左子树(这里没有左子树)为旧根节点的右子树

(6)最后插入节点 8 ,BF(6)=-2 BF(9)=1RL 型失衡,先「右旋」再「左旋」

最小不平衡子树的右子树 {9,7,10,8} 先「右旋」

右旋:

  • 旧根节点(节点 9 {9,10})为新根节点(节点 7)的右子树
  • 新根节点(节点 7)的右子树(这里是 节点 8)为旧根节点(节点 9)的左子树

最小不平衡子树 {6,5,7,9,8,10} 再「左旋」

左旋:

  • 旧根节点(节点 6 {6,5} )为新根节点(节点 7)的左子树
  • 新根节点的左子树(这里没有)为旧根节点的右子树

左旋结束

程序结束


🌟6.完结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值