1.原理介绍
了解红黑树之前需要了解二叉查找树(二叉排序数)
1.左子树上所有结点的值均小于或等于它的根结点的值。
2.右子树上所有结点的值均大于或等于它的根结点的值。
3.左、右子树也分别为二叉排序树。
为什么要用红黑树?
红黑树放弃了追求完全平衡,追求大致平衡,任何不平衡都会在3次旋转之内解决,平衡二叉树不行
红黑树是一种近似平衡的二叉查找树,它能够确保任何一个节点的左右子树高度差不超过二者中较低那个的两倍,具体来说红黑树是满足如下条件的二叉查找树
①每个节点要么是红色,要么是黑色
②根节点必须是黑色
③每个叶子节点都是黑色,指的是空节点
④红色节点不能连续(即,红色节点的孩子和父亲都不能是红色)
⑤对于每个节点,从该点到null(叶子节点之后)的任何路径,都含有相同个数的黑色节点
性质⑤确保没有一条路径会比其他路劲长出两倍,因为如果红色不能连续出现两次,所以红色之后一定是黑色,如果长过两倍,那么一定会多一个黑色
在树的结构发生变化时(插入删除操作),往往会破坏上述条件3或4,需要通过调整使得查找树重新满足红黑树的条件
2.红黑树的基本操作
2.1左旋(相对于右孩子的右孩子后面插入节点会不平衡)
步骤:
①得到x的右子树,也就是y
②将x的右孩子指向y的左孩子
③y的左孩子的父亲指向x
④y的父亲指向x的父亲(因为对父亲赋值没有方向,可以先设置)
---如果x的父亲为空,表明根节点,根节点直接指向y
---如果x是父亲的左孩子,则x的父亲的左孩子指向y
---如果x是右孩子,则x的父亲的右孩子指向y
⑤y的左孩子指向x,x的父亲指向y
2.2右旋(相对于左孩子的左孩子后面插入节点会不平衡)
①获取y的左孩子,赋值为x
②将y的左孩子指向x的右孩子
③x的右孩子的父亲指向y
④