红黑树:
特性
- 根节点始终为黑节点
- 从根节点开始到叶子节点所经过的黑节点数始终相同
- 新节点为红色,空节点为黑色
- 父节点与父节点之间不能同时为红色
平衡原则:
旋转原则:
颜色变化:
- 红红旋转颜色不变。
- 红黑旋转,旋转后的父节点变黑色,子节点变红色。
- 黑红旋转,旋转后的父节点变红色,子节点变黑色。
结构变化:
- 左旋转:3层节点间旋转,第二层节点变主节点,第一层节点成第二层节点的左节点,第三层的右节点为第二层节点的右节点,当第三层有左节点时,会成为第一层节点的右节点。如图1
- 右旋转:3层节点间旋转,第二层节点变主节点,第一层节点成第二层节点的右节点,第三层的左节点为第二层节点的左节点,当第三层有右节点时,会成为第一层节点的左节点。如图2
插入节点时:
插入节点颜色变化,插入节点为红节点,父节点如果为红色,则判断父节点的兄弟节点是否为红色,如果父节点的兄弟节点为红色,在判断父节点的父节点是否黑色,是则父节点与父节点的兄弟节点与父父节点互换颜色,如果父节点的兄弟节点为黑色,则父节点与父父节点旋转。在判断从互换后父父父节点开始以上操作。直到为父节点为黑色。
- 父节点没有兄弟节点,需要旋转一至两次使之平衡
删除节点时:
- 如果有子节点的话,首先从左子节点寻找是否存在,存在的话,在判断是左子节点是否存在子节点,如果存在获取最右边的子节位置指针做为删除节点的指针(删除节点并没有删除),并删除最右边节点,如果左子节点不存在子节点的话,直接指向左子节点的指针,并删除左子节点,如果左子节不存在,则父节点指向右节点,删除当前节点。
删除节点,颜色变换:
- 如果删除的节点有黑色兄弟节点并有2个黑侄子节点(叶子节点下默认有2个空节点),父节点与子节点颜色互换
- 如果删除的节点为红色,则不需要操作
- 如果删除的节点当前节点,父节点指向右节点的时候,子节点变黑色
AVL平衡二叉树
实现完全平衡的二叉树
平衡原则:
平衡原则:
结构变化:与红黑树类似
插入节点时:每次插入节点时都会向上每个统计每个节点的位置做到左节点的位置与右节点的位置差不大于1实现完全平衡
删除操作与红黑树类似,AVL树删除后,会与每个节点做一次位置统计。
总结:
红黑树,查询效率相对较低,添、删效率高于AVL树。