数据结构:红黑树
2020-01-11 18:05
274 查看
定义:红黑树是一种特殊的二叉查找树,而且也包含了二叉平衡树的概念,防止二叉树出现畸形的情况
红黑树规则图示
代码实现
public class RBTree<T extends Comparable<T>> { private RBTNode<T> mRoot; // 根结点 private static final boolean RED = false; private static final boolean BLACK = true; public class RBTNode<T extends Comparable<T>> { boolean color; // 颜色 T key; // 关键字(键值) RBTNode<T> left; // 左孩子 RBTNode<T> right; // 右孩子 RBTNode<T> parent; // 父结点 public RBTNode(T key, boolean color, RBTNode<T> parent, RBTNode<T> left, RBTNode<T> right) { this.key = key; this.color = color; this.parent = parent; this.left = left; this.right = right; } } ... }
可以发现代码跟二叉搜索树很像,但是当你对树进行操作时一定要注意这个树还满足红黑树的基本规则。调整红黑树的方法有变色、左旋、右旋。
变色:可以把节点的红黑两个互换
左旋:将当前节点变为左节点
右旋:将当前节点变为右节点
添加子节点(前几步是固定的)
- 按照二叉搜索树那样在合适的位置添加节点
- 把这个添加的节点变为红色(为什么不设为黑色?设为黑色就不满足规则5,包含这个节点的路上黑色节点会多一个)
- 【开始分情况考虑】
(1)如果当前节点的叔叔节点是红色:设置当前的父节点为黑色,设置祖父节点为红色,叔叔节点为黑色(这样就解决了规则四的红色节点的子节点都是黑色,同时也避免了规则5的问题)
(2)叔叔节点为黑色,当前节点为父节点的右子节点,通过左旋来实现,矛盾节点的上移,同时将当前节点设置为他之前的父节点。
(3)叔叔节点为黑色,当前节点为父节点的左子节点,通过右旋加变色实现。将他的父节点变为黑色,祖父节点变为红色,已祖父节点开始右旋。这样就实现了矛盾节点上移。再次判断是否符合情况。
删除节点
- 点赞
- 收藏
- 分享
- 文章举报