【数据结构】平衡二叉树的旋转机制

目录

前言

一、为什么需要平衡?

二、两种旋转规则

规则1.左旋

规则2:右旋

三、需要旋转的四种场景

1、LL型失衡:右旋 (Right Rotation)

2、LR型失衡:先左旋,再右旋 (Left-Right Rotation)

3、RR型失衡:左旋 (Left Rotation)

4、RL型失衡:先右旋,再左旋 (Right-Left Rotation)


前言

在 Java 的集合框架中,TreeSet 和 TreeMap 拥有自动排序的能力,这一切的根基,都建立在一种数据结构之上------平衡二叉树(AVL树)。今天来介绍一下408最爱的平衡二叉树的四种旋转机制。

一、为什么需要平衡?

在了解旋转之前,我们先看看普通的**二叉查找树(BST)**有什么致命缺陷。

二叉查找树的规则很简单:左子节点 < 父节点 < 右子节点。 这看起来很完美,每次查找都能排除一半的数据。但如果你按顺序插入一组数据:

它会一直往右边长,彻底退化成一条单向链表!

为了防止这种的情况,AVL树(平衡二叉树) 诞生了。它给自己定下了一条规则: 任何节点的左子树和右子树的高度差,绝对不能超过 1。 一旦超过 1,它就会触发修复机制------旋转。

二、两种旋转规则

旋转机制以及触发规则:

  • 规则1:左旋
  • 规则2:右旋
  • 触发规则:当添加一个节点后,该二叉树不再是一个平衡二叉树。

规则1.左旋

普通场景:

当12这个节点加入这个平衡二叉树后,破坏了二叉树的平衡状态:

确定支点:

从添加的节点开始往父节点找,找到的第一个不平衡的节点,即为支点。

在本例中节点10为支点,以10为支点向左旋转:

步骤:

1:以不平衡的点作为支点。

2:把支点左旋降级,变成左子节点。

3:晋升原来的右子节点。

特殊场景:

步骤:

1:以不平衡的点作为支点。

2:将根节点的右侧往左拉。

3:原先的右子节点变成新的父节点,并把多出来的左子节点,给已经降级的根节点当右子节点。

规则2:右旋

步骤:

1:以不平衡的点作为支点。

2:把支点右旋降级,变成右子节点。

3:晋升原来的左子节点。

三、需要旋转的四种场景

1、LL型失衡:右旋 (Right Rotation)

场景: 在节点 A 的左 孩子的左子树上插入了新节点,导致 A 的左边太重了。

一次右旋

2、LR型失衡:先左旋,再右旋 (Left-Right Rotation)

场景: 在节点 A 的左 孩子的右子树上插入了新节点,破坏了二叉树的平衡状态。

3、RR型失衡:左旋 (Left Rotation)

场景: 在节点 A 的右 孩子的右子树上插入了新节点,导致 A 的右边太重了。

4、RL型失衡:先右旋,再左旋 (Right-Left Rotation)

场景: 在节点 A 的右 孩子的左子树上插入了新节点。

相关推荐
by209998 小时前
list 的使用:把节点、位置和操作联系起来的综合叙述(上)
数据结构·c++·笔记·list
東隅已逝,桑榆非晚8 小时前
数据结构队列
数据结构·笔记·学习
老王爱玩车8 小时前
字符串和字符串函数
c语言·开发语言·数据结构·学习
H.莓飛8 小时前
【数据结构】二叉树
linux·数据结构·算法
梦帮科技9 小时前
【3.0修订版】创世与节点工程:genesis.json 与 node.toml 解剖
数据结构·算法·json·去中心化·区块链·智能合约·信任链
梦帮科技9 小时前
【3.0修订版】 RNS 代币架构:ERC20 五件套扩展与六钱包分配
数据结构·后端·算法·架构·node.js·区块链·php
h_a_o777oah1 天前
【树论】树链剖分:将树形结构转化为线性结构以处理树上路径问题(洛谷 P3384 附C++代码模板)
数据结构·算法·线段树·acm·树链剖分·树论·重链剖分
HEJOO91 天前
指针的算术运算详解
java·数据结构·算法
Coder-magician1 天前
《代码随想录》刷题打卡day47:并查集-part01
数据结构·算法·图论
垆边人似月.1 天前
VLAN 资源池(100~200 分档)
数据结构·算法