红黑树(RedblackTree)上--增加节点

本文介绍了红黑树的基本概念,包括其作为二叉搜索树的特性,节点颜色规则等。详细阐述了新节点插入过程,并通过实例展示了插入后如何进行平衡调整。同时提供了红黑树增加节点的代码实现,探讨了代码优化策略,帮助读者深入理解红黑树的工作原理。
摘要由CSDN通过智能技术生成

一、什么事RBtree:

所谓的红黑树它需要满足一下条件:
1、该树是一颗二叉搜索树(搜索树就是按照节点值大小进行排序插入,中序就是所有节点的从小到大排序)
2、每个节点不是红色就是黑色
3、根节点为黑色
4、红节点不相连
5、任一节点至NULL(树尾)的任何途径,所含之黑节点树必须相同
为了统一,我们视NULL为黑节点。

红黑树的有点就在于它没有平衡因子,唯一需要让它调整的就是新节点的颜色,在数据插入上大大减少了调整次数。
我们来简单的看一组数据组成的个红黑树的模型:
{100,80,60,40,50,75,73,72,74}
这里写图片描述
新节点的颜色我们设为红色,我们把新的节
这里写图片描述
这里写图片描述
上图是模型红黑树调整的全过程,蓝色箭头代表的是平衡的红黑树有的是新节点的插入,红箭头代表对新插入节点导致不平衡的调整平衡过程。

二、RBTree是怎么实现的:

树的操作再前面刚开始学二叉树的时候相信你已经有所掌握,bst、avl、rbt树都一样,这三中树最重要的操作就是增加节点和删除节点,在这里我也只对节点的增加进行代码分析,在红黑树下篇会对其节点的删除代码进行分析,下面就是RBtree的增加节点代码展示:

#pragma once

template<class Type>
 class RBTree;
typedef enum{RED = 0, BLACK = 1}COLOR;
template<class Type>
class RBNode
{
    friend class RBTree<Type>;
public:
    RBNode():data(Type()),leftchild(NULL),rightchild(NULL),color(0),parent(NULL)
    {}
    RBNode(Type d = Type(), RBNode<Type>* left = NULL, RBNode<Type>* right = NULL, RBNode<Type>* pr = NULL, COLOR c = RED):data(d), parent(pr),leftchild(left),rightchild(right),color(c)
    {}
private:
    COLOR color;
    Type data;
    RBNode<Type>* parent;
    RBNode<Type>* leftchild;
    RBNode<Type>* rightchild;

};
template<class Type>
class RBTree
 {
 public:
     RBTree():root(NULL)
     {}
 public:
     bool Insert(const Type & x)
     {
         return Insert(root, x);
     }
 protected:
     bool Insert(RBNode<Type>* &t, const Type &x)
     {
         RBNode<Type>* p = t;
         RBNode<Type> *pr = NULL;
         while(p != NULL)
         {
             if(x == p->data)
                 return false;
             pr = p;
             if(x < p->data)
                 p=p->leftchild;
             else 
                 p = p->rightchild;
         }
         p = _Buynode(x);
         if(pr == NULL)
         {
             p ->color = BLACK;
             t = p;
             return true;
         }
         if( x < pr->data)
             pr->leftchild = p;
         else
             pr ->rightchild = p;
         p->parent = pr;
         _Balance_Tree(t,p);
         return true;
     }
 protected:
    //这里的调整方法比较复杂,代码最下面有优化代码,仔细阅读世界独有,走马观花竹篮打水
     void _Balance_Tree(RBNode<Type>* &t, RBNode<Type>* q)
     {
         while(q->parent != NULL && q->parent->color == RED)//p->parent != NULL 是为了保证循环条件成立不会造成程序的崩溃,提高了程序的严谨性
         {
             RBNode<Type> * s 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值