AVL

时光总嘲笑我的痴心妄想 提交于 2020-01-23 16:39:54

学习自wiki

https://en.wikipedia.org/wiki/AVL_tree
https://zh.wikipedia.org/wiki/%E6%A0%91%E6%97%8B%E8%BD%AC
https://zh.wikipedia.org/wiki/AVL%E6%A0%91

AVL

旋转

在这里插入图片描述

在数据结构中,树旋转(英语:Tree rotation)是对二叉树的一种操作,不影响元素的顺序(可以理解为旋转操作前后,树的中序遍历结果是一致的,也就是说旋转过程中也始终受二叉搜索树的主要性质约束:右子节点比父节点大、左子节点比父节点小),但会改变树的结构,将一个节点上移、一个节点下移。树旋转会改变树的形状,因此常被用来将较小的子树下移、较大的子树上移,从而降低树的高度、提升许多树操作的效率。

AVL

在计算机科学中,AVL树是最早被发明的自平衡二叉查找树。在AVL树中,任一节点对应的两棵子树的最大高度差为1,因此它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下的时间复杂度都是O(lgn)。增加和删除元素的操作则可能需要借由一次或多次树旋转,以实现树的重新平衡。

在这里插入图片描述
AVL的插入就像二叉查找树一样,不过为了维护性质,AVL树需要依靠旋转来达到平衡
对一棵树进行旋转时,这棵树的根节点是被旋转的两棵子树的父节点,称为旋转时的根(英语:root);如果节点在旋转后会成为新的父节点,则该节点为旋转时的转轴(英语:pivot),以下图表以四列表示四种情况,每行表示在该种情况下要进行的操作。在左左和右右的情况下,只需要进行一次旋转操作;在左右和右左的情况下,需要进行两次旋转操作。

注意:下面一开始的四幅图为插入或者删除导致失衡后的状态,三角形为高为h的树,C或者D树是插入或者删除这个节点所在的树,因为插入或者删除都需要从这个点开始向根的方向查找第一个失衡子树(下面的黄色点)

在这里插入图片描述

插入:

从插入点开始,需要从这个点开始向根的方向查找第一个失衡子树,然后以该失衡节点和他相邻的刚查过的两个节点构成调整子树,使之成为调整子树,使之成为新的平衡子树,当失衡的最小子树被调整成为平衡子树后,又是AVL

删除:

  1. 查找:现在平衡二叉树中查找到关键字为k的节点q
  2. 删除:删除q
    在这里插入图片描述
  3. 若删除的是节点q,则从节点q向根的方向查找第一个失衡子树,进行旋转调整

Q

旋转距离:两棵二叉树之间的旋转距离指的是, 其中一棵树通过尽可能少的树旋转变换到另一棵树的过程中所需要的旋转次数. 对于一个包含相同个数节点的二叉树集合, 它们两两之间的距离可以构成一个度量空间. 是否存在一个算法, 能在多项式时间内计算两个二叉树之间的旋转距离, 当前还是一个未解决问题.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!