一、红黑树的定义和性质:
红黑树定义:红黑树是一颗二叉搜索树,且每个节点上增加一个数据位,用来表示为红色或者黑色,由性质2和性质4可以保证没有一条路径会比其他路径长出两倍,因此是近似平衡的。
性质:
1.红黑树中每一个节点,要么是红色,要么是黑色
2.一个节点为红色,则它的的两个孩子节点为黑色
3.根节点为黑色
4.从任意节点到其叶子节点的简单路径上,包含的黑色节点个数是一样的
5.叶子节点是黑色(叶子节点是空节点,被称为NIL节点)
二、讲解红黑树的插入和删除之前,先讲一下左旋和右旋
一共有四种:
1.RR型,以p节点为根节点进行左旋
2.RL型 先以P1为根节点进行右旋,再以P为根节点进行左旋
3.LL型 以P为根节点进行右旋
4.LR型 以P1为根节点进行左旋,然后以P为根节点进行右旋(见上图)
三、红黑树插入
思路:由于红黑树是二叉搜索树,插入时间复杂度为O(logn),插入是作为叶子节点插入的,如果插入之后着成黑色,则会破坏性质4,如果着成红色,如果着成红色,则会破坏性质2和3。考虑到着成红色,调整更为便利。
着成红色会出现以下集中情况
1.没有父节点,则直接着成黑色即可
2.父节点为黑色,不需要调整
3.父节点为红色,且叔叔节点也为红色(此时爷爷节点一定为黑色),此时将父节点和叔叔节点都着为黑色,且将爷爷节点着为红色,但爷爷节点的父节点可能为红色,因此继续向上调整,直到不出现父子节点都为红色为止(最终根节点一定为黑色)。
4.父节点为红色,且叔叔节点不存在,父节点为爷爷节点的左孩子(即是叶子节点和空节点,此时不可能为普通的黑色节点,破坏性质4)
4.1 假设插入的节点为父节点的左孩子,此时变成了LL型,此时以爷爷节点进行右旋,将爷爷节点着为红色,父节点着为黑色即可
4.2 假设插入的节点为父节点的右孩子,此时变成了LR型,此时以父节点进行左旋(此时树形结构变成了4.1),以爷爷节点进行右旋,将新插入的节点着为黑色,爷爷节点着为红色即可
5.父节点为红色,且叔叔节点不存在,父节点为爷爷节点的右孩子
5.1 插入节点为父节点的右孩子,此时变成RR型,参考4.1的调整
5.2 插入节点为父节点的左孩子,此时变成RL型,参考4.2的调整
四、红黑树删除
思路:删除节点只包含以下几种情况,要删除的节点为叶子节点,要删除的节点只包含左子树或右子树,要删除的节点包含左子树和右子树可以采用右子树中最小的节点替代要删除的节点,这样只要删除右子树中最小的节点(一定为叶子节点)。
1.当要删除的节点只包含左子树
此时要删除的节点只能为黑色,其左子树的根节点只能为红色,直接删除。
2.当要删除的节点只包含右子树
此时要删除的节点只能为黑色,其右子树的根节点只能为红色,直接删除。
3.当删除的节点为叶子节点时
3.1 删除节点为红色,直接删除
3.2 删除节点为黑色(未完待续...)