数据结构 --- AVL平衡二叉树基础

平衡二叉树和普通二叉搜索树的区别

  • 二叉搜索树:左边孩子节点 < 父节点,右边孩子节点 > 父节点
  • 如果数据是有序的,创建出来的二叉搜索树会出现不平衡的现象(是单边的),单边的情况,和数组的查找速度一样,效率不高,二叉搜索树最坏的情况:4 - 7 - 8 - 9 - 10,为了提高查找效率,对二叉搜索树做一个调整,调整为平衡的
  • AVL树是根据它的发明者G.M. Adelson-Velsky和E.M. Landis命名的。 它是最先发明的自平衡二叉查找树,也被称为高度平衡树。 相比于"二叉查找树",它的特点是: AVL树中任何节点的两个子树的高度最大差别只为1

  • 平衡二叉树节点分布比较平衡,搜索速度比较快,不会存在最坏的一种情况:单边的情况

数据结构 --- AVL平衡二叉树基础_第1张图片

对于节点7, 右子树的高度是1,左子树的高度是3,两个子树的高度差是2,是不平衡的

数据结构 --- AVL平衡二叉树基础_第2张图片

AVL树的查找、插入和删除在平均和最坏情况下都是O(logn)。 如果在AVL树中插入或删除节点后,使得高度之差大于1。此时, AVL树的平衡状态就被破坏,它就不再是一棵二叉树; 为了让它重新维持在一个平衡状态,就需要对其进行旋转处理。 学AVL树,重点的地方也就是它的旋转算法

前面说过,如果在AVL树中进行插入或删除节点后,可能导致AVL树失去平衡。 这种失去平衡的可以概括为4种形态:LL(左左),LR(左右),RR(右右)和RL(右左)。 下面给出它们的示意图:

  • 判断是否存在这4种形态,如果存在就要做旋转操作

  • k2,k1,x会导致二叉搜索树不平衡,左左:左边有两个节点,LL型,这样的结构会导致二叉搜索树不平衡,采用右旋的方式:把 x---k1 固定,把 k2 往右甩下来,k2 成为 k1 的右子树

  • 原因:LL型再插入一个节点,可能存在会导致不平衡的节点(插入节点成为 x 的左子树的情况),把 k2 甩下来后再做插入,就不可能存在不平衡的状态

数据结构 --- AVL平衡二叉树基础_第3张图片

k2 是某个节点的孩子节点

数据结构 --- AVL平衡二叉树基础_第4张图片

右右型,左左型的对称版,再插入一个节点,可能存在会导致不平衡的节点,把 x---k1 固定,把 k2 往左甩下来,k2 成为 k1 的左子树

数据结构 --- AVL平衡二叉树基础_第5张图片

y 原来是 k2 的左子树,y 放的位置不变,k2 把原来 z 的位置占了,z 放在 k2 的右子树

数据结构 --- AVL平衡二叉树基础_第6张图片

 具有左子树,再具有右子树,这种也会导致二叉搜索树不平衡

数据结构 --- AVL平衡二叉树基础_第7张图片

 第1步:针对 k1 节点做左旋运动 ,x 节点变成了 k1 的父节点,k2 仍然在原来的位置,(LR型做左旋)变成了一条线的情况(LL型)

第2步: k2 做右旋,变成平衡的状态数据结构 --- AVL平衡二叉树基础_第8张图片

数据结构 --- AVL平衡二叉树基础_第9张图片

第1步:针对 k1做右旋,把 k1甩下来,k1 成为 x 的右子树,k2仍然指向k1的位置,由于x 和 k1 交换了位置,k2 指向了x 的位置

第2步: k2 做左旋,变成平衡的状态

实现左旋、右旋代码即可,左右型的情况:先对一个节点做左旋,再对一个节点做右旋就可以了

模拟平衡二叉树的构建和旋转过程

数据结构 --- AVL平衡二叉树基础_第10张图片

 数据结构 --- AVL平衡二叉树基础_第11张图片

数据结构 --- AVL平衡二叉树基础_第12张图片

 数据结构 --- AVL平衡二叉树基础_第13张图片

数据结构 --- AVL平衡二叉树基础_第14张图片

数据结构 --- AVL平衡二叉树基础_第15张图片

数据结构 --- AVL平衡二叉树基础_第16张图片

数据结构 --- AVL平衡二叉树基础_第17张图片

数据结构 --- AVL平衡二叉树基础_第18张图片

你可能感兴趣的:(数据结构,数据结构,平衡二叉树)