红黑树的三种插入数据的代码实现

enum Color{
BLACK, RED
}

class RBNode<T extends Comparable>{
private T data;
private RBNode left;
private RBNode right;
private RBNode parent;
private Color color;

public RBNode(T data, RBNode<T> left, RBNode<T> right, RBNode<T> parent, Color color) {
    this.data = data;
    this.left = left;
    this.right = right;
    this.parent = parent;
    this.color = color;
}

public T getData() {
    return data;
}

public void setData(T data) {
    this.data = data;
}

public RBNode<T> getLeft() {
    return left;
}

public void setLeft(RBNode<T> left) {
    this.left = left;
}

public RBNode<T> getRight() {
    return right;
}

public void setRight(RBNode<T> right) {
    this.right = right;
}

public RBNode<T> getParent() {
    return parent;
}

public void setParent(RBNode<T> parent) {
    this.parent = parent;
}

public Color getColor() {
    return color;
}

public void setColor(Color color) {
    this.color = color;
}

}

class RBTree<T extends Comparable>{
private RBNode root;

public RBTree() {
    this.root = null;
}

private void leftRotate(RBNode<T> node){
    RBNode<T> child = node.getRight();
    child.setParent(node.getParent());
    if(node.getParent() == null){
        this.root = child;
    } else {
        if(node.getParent().getLeft() == node){
            node.getParent().setLeft(child);
        } else {
            node.getParent().setRight(child);
        }
    }

    node.setRight(child.getLeft());
    if(child.getLeft() != null){
        child.getLeft().setParent(node);
    }

    child.setLeft(node);
    node.setParent(child);
}

private void rightRotate(RBNode<T> node){
    
}

private Color color(RBNode<T> node){
    return node == null ? Color.BLACK : node.getColor();
}

public void setColor(RBNode<T> node, Color color){
    node.setColor(color);
}

public RBNode<T> left(RBNode<T> node){
    return node.getLeft();
}

public RBNode<T> right(RBNode<T> node){
    return node.getRight();
}

public RBNode<T> parent(RBNode<T> node){
    return node.getParent();
}

}
private void fixAfterInsert(RBNode node) {
while(color(parent(node)) == Color.RED){
if(left(parent(parent(node))) == parent(node)){
// 当前节点,父节点在祖先节点的左子树
RBNode uncle = right(parent(parent(node)));
if(color(uncle) == Color.RED){ // 插入情况1
setColor(parent(node), Color.BLACK);
setColor(uncle, Color.BLACK);
setColor(parent(parent(node)), Color.RED);
node = parent(parent(node));
} else {
if(node == right(parent(node))){ // 插入情况3前半段
node = parent(node);
leftRotate(node);
}

                setColor(parent(node), Color.BLACK); // 插入情况3后半段和情况2合并
                setColor(parent(parent(node)), Color.RED);
                rightRotate(parent(parent(node)));
            }
        } else {
            // 当前节点,父节点在祖先节点的右树
            RBNode<T> uncle = left(parent(parent(node)));
            if(color(uncle) == Color.RED){ // 插入情况1
                setColor(parent(node), Color.BLACK);
                setColor(uncle, Color.BLACK);
                setColor(parent(parent(node)), Color.RED);
                node = parent(parent(node));
            } else {
                if(node == left(parent(node))){ // 插入情况3前半段
                    node = parent(node);
                    rightRotate(node);
                }

                setColor(parent(node), Color.BLACK); // 插入情况3后半段和情况2合并
                setColor(parent(parent(node)), Color.RED);
                leftRotate(parent(parent(node)));
            }
        }
    }
    // 有可能向上回溯到根节点跳出,把根节点置成黑色
    setColor(this.root, Color.BLACK);
}

安静 2019/7/12 16:21:43

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值