红黑树的插入和创建

红黑树的插入和创建
import java.util.Random;

public class RBTree<T extends Comparable> {

    private RBTreeNode<T> root;
    private static final boolean red=true;
    private static final boolean black=false;

    public void creatRBT(T[] arr)
    {
        for(int i=0;i<arr.length;i++)
        {
            this.insertRBT(arr[i]);
        }
    }

    public void insertRBT(T key)
    {
        RBTreeNode<T> insertNode=new RBTreeNode<>();
        insertNode.setKey(key);
        insertNode.setColor(red);
        this.insertRBT(insertNode,root,null);
    }
    public static boolean fixed=true;
    public boolean insertRBT(RBTreeNode<T> insertNode,RBTreeNode<T> tempNode,RBTreeNode<T> preNode)
    {       
        if(tempNode==null)
        {
            if(preNode==null) {insertNode.setColor(black);root=insertNode;}
            else if(preNode.getKey().compareTo(insertNode.getKey())>0) {preNode.setLeftchild(insertNode);insertNode.setParent(preNode);}
            else {preNode.setRightchild(insertNode); insertNode.setParent(preNode);}
            fixed=false;
        }
        else {
            if(tempNode.getKey().equals(insertNode.getKey())) { return false;}
            if(tempNode.getKey().compareTo(insertNode.getKey())>0)
            {
                if(!this.insertRBT(insertNode, tempNode.getLeftchild(), tempNode)) return false;
                if(!fixed) {
                    this.fixRBT(insertNode);
                    fixed=true;
                }
            }
            else {
                if(!this.insertRBT(insertNode, tempNode.getRightchild(), tempNode)) return false;
                if(!fixed) {
                    this.fixRBT(insertNode);
                    fixed=true;
                }
            }
        }
        return true;
    }
    public boolean fixRBT(RBTreeNode<T> targetNode)
    {   
        if(targetNode.getParent()!=null)
        {   
            RBTreeNode<T> parentNode=targetNode.getParent();
            if(parentNode.isColor())
            {   
                RBTreeNode<T> gparentNode=parentNode.getParent()!=null?parentNode.getParent():null;
                if(gparentNode!=null)
                {   
                    if(gparentNode.getLeftchild()!=null&&gparentNode.getLeftchild().equals(parentNode))
                    { 
                        RBTreeNode<T> broNode=gparentNode.getRightchild();
                        if(broNode==null||!broNode.isColor())
                        {   
                            if(parentNode.getLeftchild()!=null&&parentNode.getLeftchild().equals(targetNode))
                            {
                                parentNode.setColor(black);
                                gparentNode.setColor(red);
                                this.R_Rotate(gparentNode);
                                //fixed=true;
                                //break;
                            }
                            else
                            {
                                    targetNode.setColor(black);
                                    gparentNode.setColor(red);
                                    this.L_Rotate(parentNode);
                                    this.R_Rotate(gparentNode);
                                    //fixed=true;
                                    //break;
                            }
                        }
                        else {
                            parentNode.setColor(black);
                            broNode.setColor(black);
                            gparentNode.setColor(red);
                            targetNode=gparentNode;
                            this.fixRBT(targetNode);
                            return true;
                            //break;
                            //break;
                            }
                    }
                    else {
                        RBTreeNode<T> broNode=gparentNode.getLeftchild();
                        if(broNode==null||!broNode.isColor())
                        {   
                            if(parentNode.getRightchild()!=null&&parentNode.getRightchild().equals(targetNode))
                            {
                                parentNode.setColor(black);
                                  gparentNode.setColor(red);
                                  this.L_Rotate(gparentNode);
                                  //fixed=true;
                                 // break;
                            }
                            else
                            {
                                targetNode.setColor(black);
                                gparentNode.setColor(red);
                                this.R_Rotate(parentNode);
                                this.L_Rotate(gparentNode);
                                //fixed=true;
                                //break;
                            }
                        }
                        else {
                            parentNode.setColor(black);
                            broNode.setColor(black);
                            gparentNode.setColor(red);
                            targetNode=gparentNode;
                            this.fixRBT(targetNode);
                            return true;
                            //break;
                            //break;
                        }
                    }                   
            }               
        }           
    }   
            this.root.setColor(black);
            return true;
}
    public void R_Rotate(RBTreeNode<T> targetNode)
    {
        RBTreeNode<T> lc=targetNode.getLeftchild();
        RBTreeNode<T> parentNode=targetNode.getParent();
        targetNode.setLeftchild(lc.getRightchild());
        if(lc.getRightchild()!=null) lc.getRightchild(). setParent(targetNode);
        lc.setRightchild(targetNode);
        targetNode.setParent(lc);
        targetNode=lc;
        if(parentNode==null) {targetNode.setParent(null); root=targetNode;}
        else if(parentNode.getKey().compareTo(targetNode.getKey())>0) {targetNode.setParent(parentNode); parentNode.setLeftchild(targetNode);}
        else {targetNode.setParent(parentNode); parentNode.setRightchild(targetNode);}
    }
    public void L_Rotate(RBTreeNode<T> targetNode)
    {
        RBTreeNode<T> rc=targetNode.getRightchild();
        RBTreeNode<T> parentNode=targetNode.getParent();
        targetNode.setRightchild(rc.getLeftchild());
        if(rc.getLeftchild()!=null) rc.getLeftchild().setParent(targetNode);
        rc.setLeftchild(targetNode);
        targetNode.setParent(rc);
        targetNode=rc;
        if(parentNode==null) {targetNode.setParent(null); root=targetNode;}
        else if(parentNode.getKey().compareTo(targetNode.getKey())>0) {targetNode.setParent(parentNode);parentNode.setLeftchild(targetNode);}
        else {targetNode.setParent(parentNode); parentNode.setRightchild(targetNode);}
    }
    //中序遍历
    public void inOrderVisitRBT()
    {   
        this.inOrderVisitRBT(root);
        System.out.println();
    }
    private void inOrderVisitRBT(RBTreeNode tempNode)
    {   

        if(tempNode!=null)
        {   
            //System.out.println("111");
            this.inOrderVisitRBT(tempNode.getLeftchild());
            System.out.print(tempNode.getKey()+" ");        
            this.inOrderVisitRBT(tempNode.getRightchild()); 
        }   
    }
    //先序遍历
    public void preVisitRBT()
    {
        this.preVisitRBT(root);
        System.out.println();
    }
    public void preVisitRBT(RBTreeNode tempNode)
    {
        if(tempNode!=null)
        {
            System.out.print(tempNode.getKey()+" "+tempNode.isColor()+" ");
            this.preVisitRBT(tempNode.getLeftchild());
            this.preVisitRBT(tempNode.getRightchild());
        }
    }
      public static void main(String[] args)
       {
           Integer[] arr=new Integer[10]; 
          for(int i=0;i<10;i++)
           {
               arr[i]=new Random().nextInt(100);
               System.out.println("arr["+i+"]="+arr[i]);
           }
           RBTree<Integer> rbt=new RBTree<>();
           rbt.creatRBT(arr);
           rbt.inOrderVisitRBT();
           rbt.preVisitRBT();
       }
}

class RBTreeNode<T extends Comparable>
{
    private T key;
    private RBTreeNode<T> leftchild,rightchild,parent;
    private boolean color;//false为黑,true为红
    public T getKey() {
        return key;
    }
    public void setKey(T key) {
        this.key = key;
    }
    public RBTreeNode<T> getLeftchild() {
        return leftchild;
    }
    public void setLeftchild(RBTreeNode<T> leftchild) {
        this.leftchild = leftchild;
    }
    public RBTreeNode<T> getRightchild() {
        return rightchild;
    }
    public void setRightchild(RBTreeNode<T> rightchild) {
        this.rightchild = rightchild;
    }
    public RBTreeNode<T> getParent() {
        return parent;
    }
    public void setParent(RBTreeNode<T> parent) {
        this.parent = parent;
    }
    public boolean isColor() {
        return color;
    }
    public void setColor(boolean color) {
        this.color = color;
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
红黑树是一种自平衡二叉搜索树,它的插入操作相对比较复杂。下面是一个简单的C语言实现红黑树插入的示例代码,供你参考: ```c #include <stdio.h> #include <stdlib.h> // 红黑树节点 typedef struct TreeNode { int value; // 节点值 int color; // 颜色,0表示黑色,1表示红色 struct TreeNode *parent; // 父节点指针 struct TreeNode *left; // 左子节点指针 struct TreeNode *right; // 右子节点指针 } TreeNode; // 创建一个红黑树节点 TreeNode* createTreeNode(int value, int color, TreeNode *parent, TreeNode *left, TreeNode *right) { TreeNode *node = (TreeNode*)malloc(sizeof(TreeNode)); node->value = value; node->color = color; node->parent = parent; node->left = left; node->right = right; return node; } // 获取节点的颜色 int getColor(TreeNode *node) { if (node == NULL) { return 0; // 空节点为黑色 } else { return node->color; } } // 左旋操作 void leftRotate(TreeNode **root, TreeNode *node) { TreeNode *rightChild = node->right; node->right = rightChild->left; if (rightChild->left != NULL) { rightChild->left->parent = node; } rightChild->parent = node->parent; if (node->parent == NULL) { *root = rightChild; } else if (node == node->parent->left) { node->parent->left = rightChild; } else { node->parent->right = rightChild; } rightChild->left = node; node->parent = rightChild; } // 右旋操作 void rightRotate(TreeNode **root, TreeNode *node) { TreeNode *leftChild = node->left; node->left = leftChild->right; if (leftChild->right != NULL) { leftChild->right->parent = node; } leftChild->parent = node->parent; if (node->parent == NULL) { *root = leftChild; } else if (node == node->parent->left) { node->parent->left = leftChild; } else { node->parent->right = leftChild; } leftChild->right = node; node->parent = leftChild; } // 插入操作 void insert(TreeNode **root, int value) { // 创建一个新节点,并初始化为红色 TreeNode *node = createTreeNode(value, 1, NULL, NULL, NULL); // 执行BST插入操作 TreeNode *parent = NULL; TreeNode *current = *root; while (current != NULL) { parent = current; if (value < current->value) { current = current->left; } else { current = current->right; } } node->parent = parent; if (parent == NULL) { *root = node; } else if (value < parent->value) { parent->left = node; } else { parent->right = node; } // 颜色修正 while (getColor(node->parent) == 1) { if (node->parent == node->parent->parent->left) { TreeNode *uncle = node->parent->parent->right; if (getColor(uncle) == 1) { node->parent->color = 0; uncle->color = 0; node->parent->parent->color = 1; node = node->parent->parent; } else { if (node == node->parent->right) { node = node->parent; leftRotate(root, node); } node->parent->color = 0; node->parent->parent->color = 1; rightRotate(root, node->parent->parent); } } else { TreeNode *uncle = node->parent->parent->left; if (getColor(uncle) == 1) { node->parent->color = 0; uncle->color = 0; node->parent->parent->color = 1; node = node->parent->parent; } else { if (node == node->parent->left) { node = node->parent; rightRotate(root, node); } node->parent->color = 0; node->parent->parent->color = 1; leftRotate(root, node->parent->parent); } } if (node == *root) { break; } } (*root)->color = 0; } // 中序遍历输出红黑树 void inorderTraversal(TreeNode *node) { if (node == NULL) { return; } inorderTraversal(node->left); printf("%d(%d) ", node->value, node->color); inorderTraversal(node->right); } int main() { TreeNode *root = NULL; // 插入节点 insert(&root, 10); insert(&root, 20); insert(&root, 30); insert(&root, 15); insert(&root, 18); insert(&root, 25); insert(&root, 40); insert(&root, 12); insert(&root, 11); // 输出红黑树 printf("红黑树:"); inorderTraversal(root); return 0; } ``` 在上面的代码中,我们首先定义了一个红黑树节点结构体,包含节点值、颜色、父节点指针、左子节点指针和右子节点指针等成员。然后,我们实现创建节点、获取节点颜色、左旋和右旋等操作函数。最后,我们实现插入操作和输出红黑树的函数,并在main函数中进行了测试。 需要注意的是,红黑树插入操作相对比较复杂,需要进行颜色修正等操作,代码可能比较难理解。如果有不理解的地方,可以多看一下代码,或者参考一些其他资料。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值