java语言实现红黑树 仅仅实现了插入算法

本文介绍了一种使用Java实现的红黑树数据结构。红黑树是一种自平衡二叉查找树,通过旋转操作来维持树的平衡特性。文章详细展示了红黑树节点的定义、插入操作的实现以及树的旋转调整过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package cn.itcast.shujujiegou.tree;

/**
 * Created by likailong on 2016/10/13.
 */
public class RedBlackTree<T extends Comparable<? super T>> {
    private RedBlackNode<T> header;
    private RedBlackNode<T> nullNode;
    private static final int RED=0;
    private static final int BLACK=1;

    public boolean isEmpty() {
        return header==nullNode;
    }

    private static class RedBlackNode <T>{
        T element;
        int color;
        RedBlackNode<T> left;
        RedBlackNode<T> right;
        RedBlackNode(T theElement){
            this(theElement,null,null);
        }
        RedBlackNode(T theElement,RedBlackNode<T> lt,RedBlackNode<T> rt){
            element=theElement;
            left=lt;
            right=rt;
            color= RedBlackTree.BLACK;
        }

    }
    public RedBlackTree(){
        nullNode=new RedBlackNode<T>(null);
        nullNode.left=nullNode.right=nullNode;
        header=new RedBlackNode<T>(null);
        header.left=header.right=nullNode;
    }
    private RedBlackNode<T> rotate(T item,RedBlackNode<T> parent){
        if(compare(item,parent)<0)
            return parent.left=compare(item,parent.left)<0?rotateWithLeftChild(parent.left):rotateWithRightChild(parent.left);
        else
            return parent.right=compare(item,parent.right)<0?rotateWithLeftChild(parent.right):rotateWithRightChild(parent.right);
    }

    private RedBlackNode<T> rotateWithRightChild(RedBlackNode<T> k2) {
        RedBlackNode<T> k1=k2.right;
        k2.right=k1.left;
        k1.right=k2;
        return k1;
    }

    private RedBlackNode<T> rotateWithLeftChild(RedBlackNode<T> k2) {
        RedBlackNode<T> k1=k2.left;
        k2.left=k1.right;
        k1.right=k2;
        return k1;
    }

    private final int compare(T item,RedBlackNode<T> t ){
        if(t==header)
            return 1;
        else
            return item.compareTo(t.element);
    }
    private RedBlackNode<T> current;
    private RedBlackNode<T> parent;
    private RedBlackNode<T> grand;
    private RedBlackNode<T> great;
    private void handleReorient(T item){
        current.color=RED;
        current.left.color=BLACK;
        current.right.color=BLACK;
        if(parent.color==RED){
            grand.color=RED;
            if((compare(item,grand)<0)!=(compare(item,parent)<0))
                parent=rotate(item,grand);
            current=rotate(item,great);
            current.color=BLACK;
        }
        header.right.color=BLACK;
    }
    public void insert(T item){
        current=parent=grand=header;
        nullNode.element=item;
        while (compare(item,current)!=0){
            great=grand;
            grand=parent;
            parent=current;
            current=compare(item,current)<0?current.left:current.right;
            if(current.left.color==RED&¤t.right.color==RED){
                handleReorient(item);
            }
        }
        if(current!=nullNode)
            return;
        current=new RedBlackNode<>(item,nullNode,nullNode);
        if(compare(item,parent)<0)
            parent.left=current;
        else
            parent.right=current;
        handleReorient(item);}
    public void printTree(){
        if(isEmpty()){
            System.out.println("tree is empty");
        }else
            printTree(header.right);
    }
    private void printTree(RedBlackNode<T> t){
        if(t!=nullNode){
            printTree(t.left);
            System.out.println(t.element);
            printTree(t.right);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值