红黑树节点的插入分为两步:第一步与二叉查找树的插入相同,第二步为调整节点着色。
节点插入
新节点Z的两个孩子指向NIL,将节点z链入树的正确位置,将节点z着色为红。
着色调整
- Z节点为根节点
直接将根着色为黑
- Z节点不是根节点
因为在插入节点z之前,z的父节点的一个孩子是NIL(黑高为1),所以节点z的兄弟节点的黑高必定为1。
- Z的父节点是黑色
无需调整着色
- Z的父节点是红色
此时Z的叔叔节点的黑高必定为1.
- Z的叔叔节点是红色
此时Z的祖父节点必定为黑,将Z的父节点和叔叔节点着色为黑,将祖父节点着色为红,然后从祖父节点位置开始着色调整。示意如下:
- Z的叔叔节点是黑色
此时叔叔节点必定为NIL。
- z的叔叔是右子树
- z是右节点
将z的父节点进行左旋,然后从z的左子节点(即未旋转之前的父节点)位置开始重新着色
- z是左节点
将z的父节点着色为黑,将其祖父节点着色为红,对祖父节点进行右旋操作
- z的叔叔是左子树
- z是右节点
将z的父节点着色为黑,将其祖父节点着色为红,对祖父节点进行左旋操作
- z是左节点
将z的父节点进行右旋,然后从z的右子节点(即未旋转之前的父节点)位置开始重新着色
红黑树的节点插入状态转换图: