随处可见的红黑树

概述:在程序中随处可见的数据结构,红黑树的应用十分广泛,红黑树是一种自平衡的二叉树,目的是为了降低二叉树的层高,提高搜索效率。

一、使用场景

        1.C++中的std::map

        2.nginx 

        3.定时器,利用红黑树的顺序

        4.cfs进程调度,将各个进程添加到红黑树,每次从红黑树最左节点进程执行

        5.内存管理,每分配一块内存,将内存块添加到红黑树

二、用法

        1.key -> value,着重于查找

        2.利用红黑树的中序遍历,红黑树是有顺序的

三、红黑树性质

        1.每个节点是红的或者黑的

        2.根节点是黑的

        3.每个叶子节点是黑的

        4.如果一个节点是红的,则它的两个儿子都是黑的

        5.对每个节点,从该节点到其子孙节点的所有路径上包含相同数目的黑节点

四、红黑树定义

  1.节点定义

// 红黑树节点
typedef int KEY_TYPE

typedef struct _rbtree_node {
    unsigned char color;
    struct _rbtree_node *left;
    struct _rbtree_node *right;
    struct _rbtree_node *parent;

    KEY_TYPE key;
    void *value;
}

 2.树的定义

// 红黑树
typedef struct _rbtree {
    rbtree_node *root;
    rbtree_node *nil;
}

五、红黑树节点旋转

 左旋:改变三个方向,动六根指针

        x的右子树指向y的左子树 

        y的父节点指向x的父节点

        y的左子树指向x

// 左旋代码
void _left_rotate(rbtree *T, rbtree_node *x) {
    rbtree_node *y = x->right;
    
    // 方向1
    x->right = y->left;
    y->left = x;
    if (y->left != T->nil) {
        y->left->parent = x;
    }
    
    // 方向2
    y->parent = x->parent;
    if (x->parent == T->nil) {
        T->root = y;
    } else if (x == x->parent->left) {
        x->parent->left = y;   
    } else {
        x->parent->right = y;
    }

    // 方向3
    y->left = x;
    x->parent = y;
}

右旋:改变三个方向,动六根指针

        y的左子树指向x的右子树

        x的父节点指向y的父节点

        x的右子树指向y的左子树

 

// 右旋代码
void _right_rotate(rbtree *T, rbtree_node *y) {
    rbtree_node *x = y->left;

    // 方向1
    y->left= x->right;
    x->right= y;
    if (x->right != T->nil) {
        x->right->parent = y;    
    }

    // 方向2
    x->parent= y->parent;
    if (y->parent == T->nil) {
        T->root = x;
    } else if (y == y->parent->right) {
        y->parent->right= x;
    } else {
        y->parent->left= x;
    }

    // 方向3
    x->right= y;
    y->parent = x;
}

  待补充。

 

图是一种非常重要的数据结构,它可以用来描述各种杂的关系和结构。下面我将描述一些身边中与图有关的事物,并探索哪些应用或内部算法用到了图结构。 1. 社交网络 社交网络是一个典型的图形结构,其中每个用户可以被视为一个节点,用户之间的关系可以被视为边。通过分析社交网络中的图形结构,可以实现用户推荐、信息传播和舆情分析等功能。在社交网络中,常用的图算法包括广度优先搜索和最短路径算法等。 2. 电力网络 电力网络也是一个典型的图形结构,其中每个发电站和变电站可以被视为一个节点,相邻的发电站和变电站之间可以被视为边。通过分析电力网络中的图形结构,可以实现电力供应、故障排查和优化运营等功能。在电力网络中,常用的图算法包括最小生成树算法和最短路径算法等。 3. 地图导航 地图导航也是一个典型的图形结构,其中每个道路和交叉口可以被视为一个节点,相邻的道路和交叉口之间可以被视为边。通过分析地图导航中的图形结构,可以实现路径规划、交通状况预测和智能驾驶等功能。在地图导航中,常用的图算法包括最短路径算法和最小生成树算法等。 4. 计算机网络 计算机网络中的路由器和交换机也可以被视为图的节点,网络之间的连接可以被视为边。通过分析计算机网络中的图形结构,可以实现网络拓扑分析、带宽分配和网络优化等功能。在计算机网络中,常用的图算法包括最短路径算法和最小生成树算法等。 综上所述,图是一种非常重要的数据结构,它可以用来描述各种复杂的关系和结构。在实际应用中,开发者可以根据具体的问题需求和性能要求选择合适的图形结构,并采用相应的算法来实现数据的处理和分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值