平衡二叉树--AVL树 自平衡方式--旋转 自平衡方式--旋转

关键字: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树维持平衡的方式:平衡因子、旋转。
 
4、AVL树添加新节点:
(1)找到插入节点的位置,然后插入节点;
(2)判断此时树中是否有不平衡点。如果没有那就万事大吉。如果有,那么首先确定不平衡起始点,然后按照自平衡的旋转策略(左旋、右旋)进行相应的操作(详见:自平衡方式--旋转)。
 
5、AVL树删除节点:
(1)找到替换节点。
  ①如果删除节点是叶子节点,那么替换节点就是NULL;
  ②如果删除节点有一个子节点,那么替换节点就是其左子节点或者右子节点;(如果删除节点有一个子节点,那么这个子节点肯定是叶子节点,要满足AVL严格平衡的特性。)
  ③如果删除节点有两个孩子,那么中序遍历的后继节点就作为替换节点;
(2)将替换节点与删除节点交换;(注意:替换时本质上就是交换一下两个节点的值,两个节点原来的位置还是不变的。)
(3)删除操作:
  ①判断删除此时的替换节点之后,哪个节点会导致不平衡。确定不平衡起始点,然后按照旋转策略(详见:自平衡方式--旋转)进行相应的操作,确保删除当前节点之后树还是平衡的;
  ②经过第一步的调整,保证在删除节点之后树还是平衡的情况下,再删除节点。
 

AVL树&&红黑树对比:
①由于AVL树是要保证严格平衡的,所以对于插入和删除,会比红黑树慢,因为红黑树只是要求相对平衡;
②由于AVL树是要保证严格平衡的,所以在一定的情况下,在AVL树中进行查找会比在红黑树中快。

 
 

猜你喜欢

转载自www.cnblogs.com/axing-articles/p/11402298.html