class TreeNode{ private Boolean color; private int val; private TreeNode left; private TreeNode right; private TreeNode parent; get,set... }
class RBTree{ public boolean add(int val){...} public boolean delete(int val){...} public void display(){...} }
新插入的节点(newNode)为红色。java
按照二分查找树插入规则插入。git
分状况讨论(如下状况基本都是为了保持上文所讲的的红黑树特性4和特5)github
一、若newNode为根节点,则变为黑色,插入完毕,返回 true。数据结构
二、若newNode父节点为黑色,则插入完毕,返回 true。测试
三、以下图所示,若newNode父节点为红色,且叔叔节点存在且为红色,则父节点与叔叔节点变为黑色,祖父节点变为红色,newNode = 祖父节点。3d
四、以下图所示,若newNode父节点为红色,叔叔节点不存在或为黑色,且newNode为父节点右孩子,父节点为祖父节点左孩子,则以父节点为轴左旋,进入状况6.code
五、以下图所示,若newNode父节点为红色,叔叔节点不存在或为黑色,且newNode为父节点左孩子,父节点为祖父节点右孩子,则以父节点为轴右旋,进入状况7blog
六、以下图,此时以祖父节点为轴进行右旋,将祖父节点变为红色,newNode变为黑色。递归
七、以下图,此时以祖父节点为轴进行左旋,将祖父节点变为红色,newNode变为黑色。get
分状况讨论(和插入同样,如下状况基本都是为了保持上文所讲的的红黑树特性4和特5)
根据待删除节点和惟一子节点颜色,分状况处理:
自身O是红色,子节点N是黑色,直接删除。
自身O是黑色,子节点N是红色,直接删除并将子节点N变为黑色。
自身O是黑色,子节点N不存在(不存在即子节点为空黑色节点,也能够用来判断)或也是黑色,较为复杂,先删除,再分状况讨论:
一、N是根节点,则不须要调整。
二、以下图,N的父亲、兄弟、侄子都是黑色,则将兄弟变为红色,父亲视做N,进行递归处理。
三、(存在镜像)N的兄弟节点是红色,且N为父亲节点左儿子,则以父亲节点为轴左旋(不然右旋),并将旋转后N的祖父节点变为黑色,N的父节点变为红色,进入状况4,5或6.
四、N的父亲节点是红色,兄弟和侄子节点是黑色,父亲节点变为黑色,兄弟节点变为红色。
五、(存在镜像)N的父节点颜色随意,兄弟节点为父节点黑色右孩子,左侄子节点为红色,右侄子节点为黑色,以兄弟节点为轴进行右旋,将旋转后N的兄弟节点变为黑色,N的右侄子节点变为红色,进入状况6
六、(存在镜像)N的父节点随意,兄弟节点为父节点的黑色右儿子,右侄子节点为红色,以N的父节点为轴进行左旋,左旋后的N的祖父节点变为父节点颜色,父节点变黑,叔叔节点变黑。