AVL树

一、什么是AVL树

       AVL树是自平衡的二叉搜索树(二叉查找树、二叉排序树),AVL树再二叉搜索树的基础上通过旋转来得到平衡,平衡即任意一个结点的两个子树的高度差最高为1。

二、旋转

首先我们来看一下如何通过旋转来使得树平衡。

1、左单旋转

解决如下情况:

  1. 定义新的根结点指向当前根的右孩子
  2. 新根的左孩子等于旧根,旧根的右孩子等于新根的左孩子
  3. 将新根插入到旧根原来位置

注意:维护其中各个结点的父节点

2、右单旋转

  1. 定义新的根节点指向当前根的左孩子
  2. 新根的右孩子指向旧根,旧根的左孩子指向新根的右孩子
  3. 将新根插入旧根原来的位置

注意:维护其中各个结点的父节点

3、左双旋转

  1. 先进行一次左单旋转
  2. 再进行一次右单旋转

4、右双旋转

  1. 先进行一次右单旋转
  2. 再进行一次左单旋转

三、插入元素

1、找到被插入元素的位置

2、插入元素

3、调整平衡

前两步并没有什么难度,在二叉搜索树中找到合适的位置即可。第三步调整平衡又有以下过程:

(1)从插入元素的位置向上找,找到不平衡的位置

(2)左子树出现不平衡,进行左调整,否则右调整,左右调整则依赖于旋转(平衡与否通过平衡因子的变化来判断)

四、删除元素

删除元素分为以下步骤:

1、找到需要被删除的元素位置

2、此时判断该元素有几个子树:

  1. 没有子树,该元素是叶子节点,那么直接删除该结点即可
  2. 只有左子树或者右子树,调整该结点的父节点中孩子的指向
  3. 左右子树都有,此时应该找到该结点的后继,因为该节点右右孩子,则其后继一定是其右子树中的最左边的结点,且其后继节点最多只有一个右子树,找到之后,将后继节点的值赋给当前要删除的结点,此时删除其后继结点即可。

3、从删除结点的位置向上判断是否平衡,并进行调整。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值