摘要
AVL树插入时可能会导致失衡,找到最先失衡的子树。再根据插入方式找到三个节点(姑且称之为失衡节点)。最后找到三个失衡节点中val值在中间的失衡节点并将其旋转到失衡节点顶部即可(旋转中需要保持搜索树的性质)。
AVL树
本文只是简单介绍一下AVL树(自平衡二叉查找树)(因为看HashMap源码需要用到红黑树,学习红黑树之前先复习一下AVL树)(本文不适合初学者,只是帮助回忆)
特点:
1.二叉搜索树。
2.平衡:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1。
插入:
插入节点时可能会导致平衡因子大于1(不平衡),此时,需要进行旋转重新回到平衡状态,根据插入节点位置的不同,旋转方式分为四种:
0.插入节点导致的第一个平衡因子大于1的节点为node
a.插入节点在node的左子树的左子树:LL
/ ----> /\ 1<-2<-3 ----> 1<-2->3
/ ----> 只需将2转到3的位置: 右旋
b.插入节点在node的右子树的右子树:RR
\ ----> /\ 1->2->3 ----> 1<-2->3
\ ----> 同理,将2转到1的位置:左旋
c.插入节点在node的左子树的右子树:LR
/3 ----> /\ 目的是将三个节点(1,2,3)大小的中间值,转到树的顶部。需要注意的是,
1 过程中需要保持搜索二叉树的性质(左孩子小,右孩子大于自己),对于左边这棵
\2 树,只需:①将2移到中间,②将2移到顶部即可。①时因为2大于1所以,1是2的
左子树,所以旋转操作是左旋,②时因为3大于2,3是2的右子树,所以旋转操作
是右旋
d.插入节点在node的右子树的左子树:RL
1\ ---->/\ 同理,将大小的中间值,移到树的顶部
3 先右旋,后左旋(这么旋既能将2移到顶部,也能在旋转过程中保持搜索树的性质)
2/
插入总结:插入时可能会导致失衡,找到最先失衡的子树。再根据插入方式找到三个节点(姑且称之为失衡节点)。最后找到三个失衡节点中val值在中间的失衡节点并将其旋转到失衡节点顶部即可(旋转中需要保持搜索树的性质)。
删除:
删除动作等于:二叉搜索树删除+维护平衡(👆旋转)