普通二叉搜索树作为数据存储工具可以快速的找到一个给定关键字的数据项,并可快速插入和删除数据项;如果树中插入随机数据,执行很好,但插入有序数据,速度会变慢,并会导致非平衡,其快速查找指定数据项的能力丧失了。因此引入红-黑树,解决非平衡树问题,其本身是增加某些特点的二叉搜索树。
红黑树的插入方法:
自顶向下插入:
自底向上插入:
当树没有分支时,最不平衡,就会变成一个链表,变成一维,而非二维,其查找速度变成O(N);为了保持树的平衡,引入了红黑树,红黑树的平衡是在插入过程中取得,插入时需要检查是否破坏输的特征,及纠正。
红黑树特征:
- 节点都有颜色。
- 在插入和删除的过程中要遵循保持颜色的不同排列的规则。
红黑规则:
- 每个节点非红即黑
- 根是黑色的
- 节点是红色的,子节点必是黑色的,反之不一定是真
- 从根到叶节点或空子节点的每条路径,必须包含相同数目的黑色节点。
修正违规的情况:
- 改变节点的颜色
- 执行旋转操作
旋转:改变节点间的关系
- 使一些节点上升,一些节点下降,帮助树平衡
- 保证不破坏二叉搜索树的特征
标记代替删除,回避。
红黑树的效率与二叉树相当,但对有序数据的操作优化很多。
AVL树,节点存储左子树和右子树的高度差,左子树和右子树的高度不会相差大于一层。插入后检查高度差,通过旋转使高度相等,然后向上移动,检查,均衡,直到根。
因为树一定是均衡的,插入时需要检查两趟树(向下查找插入点,向上平衡树),所以效率较红黑树低。