关键字:AVL、插入、删除
前言: 平衡二叉树和AVL树这两个概念的区分:平衡二叉树是对这样一种数据结构的定义,是一种描述;而AVL树则是对这样子一种数据结构的实现。同红黑树和B树等一样,都是对这样一种结构的实现,同时都是具有自平衡特性的。 AVL树是最早的被发明的自平衡二叉树
1、定义:
①左子树和右子树都是AVL树
②左子树和右子树的高度差不能超过1
2、性质:
①一棵n个结点的AVL树的其高度保持在0(log2(n)),不会超过3/2log2(n+1)
②一棵n个结点的AVL树的平均搜索长度保持在0(log2(n)).
③一棵n个结点的AVL树删除一个结点做平衡化旋转所需要的时间为0(log2(n)).
3、AVL树添加新节点:
(1)找到插入节点的位置,然后插入节点
(2)"插入修复":首先确定不平衡起始点,然后按照自平衡的旋转策略(左旋、右旋)进行相应的操作(详见:自平衡方式--旋转)
4、AVL树删除节点:
(1)找到替换节点。
①如果删除节点是叶子节点,那么替换节点就是NULL;
②如果删除节点有一个子节点,那么替换节点就是其左子节点或者右子节点;(如果删除节点有一个子节点,那么这个子节点肯定是叶子节点,要满足AVL严格平衡的特性。)
③如果删除节点有两个孩子,那么中序遍历的后继节点就作为替换节点
(2)将替换节点与删除节点交换。(注意:替换时本质上就是交换一下两个节点的值,两个节点原来的位置还是不变的。)
(3)删除操作:
①判断删除此时的替换节点之后,哪个节点会导致不平衡。确定不平衡起始点,然后按照旋转策略(详见:自平衡方式--旋转)进行相应的操作,确保删除当前节点之后树还是平衡的。
③经过第一步的调整,保证在删除节点之后树还是平衡的情况下,再删除节点。
AVL树&&红黑树:
①由于AVL树是要保证严格平衡的,所以对于插入和删除,会比红黑树慢,因为红黑树只是要求相对平衡;
②由于AVL树是要保证严格平衡的,所以在一定的情况下,在AVL树中进行查找会比在红黑树中快。