红黑树原理分析
通过整个二叉树的实现相信已经可以清楚二叉树的主要特点:数据查询的时候可以提供更好的查询,但是这种原始的二叉树的结构是有明显缺陷的,例如:当二叉树结构改变的时候(增加或删除)就有可能出现不平衡的问题。
之前所谓的解决二叉树性能问题的方式最终全部都变为了null,也就是说如果要想达到最良好的效果的二叉树,那么它首先应该是一个平衡二叉树,同时所有的节点的层次深度应该相同。
如果所有的数据按照以上的结构进行保存,那么二叉树的检索操作执行效率一定是最高的,可以你的树需要可以忍受住这些频繁的增加或者是删除操作。所以针对于二叉树有了进一步的设计要求。
红黑树的本质就是在节点上追加了一个表示颜色的操作信息而已。
enum Color {
RED,BLACK;
}
class BinaryTree<T> {
private class Node {
private Node parent;
private Node left;
private Node right;
private Color colo ;
}
}
// 布尔值方式
class BinaryTree<T> {
private class Node {
private Node parent;
private Node left;
private Node right;
private boolean color ;
}
}
对于Node节点中的颜色标记也可以使用true或false来实现,不一定非要使用枚举类,一个师标准的红黑树的结构如下所示。
红色节点之后绝对不可能是红色节点,但是没有说黑色节点之后不允许是黑色节点,允许黑—黑连接。
主要是利用这个红色节点与黑色节点实现均衡的控制。简单点理解红黑树的结构就是为了可以进行左旋和右旋控制以保证树的平衡性。
但是对于平衡性,还需要考虑数据增加的平衡以及数据删除的平衡,增加和删除都是需要对这棵树进行平衡修复。
数据插入平衡修复
在进行红黑树处理的时候为了方便操作都会将新的节点使用红色来进行描述,于是当设置根节点的时候就会违反“规则2”,那么这个时候只需要将节点的颜色涂黑即可。
在红黑树进行修复处理之中,它需要根据当前节点以及当前节点的父节点和叔叔节点之间的颜色来推断树是否需要进行修复处理。
数据删除平衡修复
在红黑树之中修复的目的是为了保证树结构中的黑色节点的数量平衡,黑色节点的数量平衡了,那么才可能得到“O(logn)”的执行性能,但是修复的过程一方面是红黑的处理,另外一方面就是黑色子节点的保存层次。