如果说平衡二叉树是一个类的话,那么红黑树就是该类的一个实例。
算法的书我丢久了,一下子也找不到,我是凭记忆说的。红黑树的算法比较麻烦,但它的思想很好,如果理解了它的思想也就理解它的算法,我也只记得思想,具体算法记不得了。我就在这说说思想吧。
红黑树有两个重要性质:
1、红节点的孩子节点不能是红节点;
2、从根到前端节点的任意一条路径上的黑节点数目一样多。
这两条性质确保该树的高度为logN,所以是平衡树。
插入的节点总是设为红节点,当其复节点为红节点时,这就有破坏了性质1,就需要调整。将插入节点作为考察节点,考察其叔父,如果也是红节点,则将其父亲和叔父改为黑节点,而将其祖父改为红节点,然后以其祖父为考察节点。如果其叔父是黑节点则做一旋转变换可以搞定,没有图不太好说明,你可以自己考虑一下,总之它的思想是把“多出来”的红色往上一层推去,确保下面层红黑性质,最后推到根以后,如果依然违反性质1,则可以直接把根由红改黑即可,就相当于把这“多出来”的红色推到树以外的节点去了。
删除节点时先要找到顶替的节点,如果删去的节点是黑色则破坏了性质2,也需要调整。调整的思想也同前面类似,把这个黑色赋予顶替节点,则顶替节点相当于有两重黑色,然后将它的两重黑色向上推,一直推到根,再从根推到外面去了。
算法的书我丢久了,一下子也找不到,我是凭记忆说的。红黑树的算法比较麻烦,但它的思想很好,如果理解了它的思想也就理解它的算法,我也只记得思想,具体算法记不得了。我就在这说说思想吧。
红黑树有两个重要性质:
1、红节点的孩子节点不能是红节点;
2、从根到前端节点的任意一条路径上的黑节点数目一样多。
这两条性质确保该树的高度为logN,所以是平衡树。
插入的节点总是设为红节点,当其复节点为红节点时,这就有破坏了性质1,就需要调整。将插入节点作为考察节点,考察其叔父,如果也是红节点,则将其父亲和叔父改为黑节点,而将其祖父改为红节点,然后以其祖父为考察节点。如果其叔父是黑节点则做一旋转变换可以搞定,没有图不太好说明,你可以自己考虑一下,总之它的思想是把“多出来”的红色往上一层推去,确保下面层红黑性质,最后推到根以后,如果依然违反性质1,则可以直接把根由红改黑即可,就相当于把这“多出来”的红色推到树以外的节点去了。
删除节点时先要找到顶替的节点,如果删去的节点是黑色则破坏了性质2,也需要调整。调整的思想也同前面类似,把这个黑色赋予顶替节点,则顶替节点相当于有两重黑色,然后将它的两重黑色向上推,一直推到根,再从根推到外面去了。