红黑树详解


title: 红黑树原理

红黑树提纲

  • 2-3树介绍
  • 红黑树
    该博客都是读者具备二分树基础知识前提下写的(不清楚的不要看下面的内容了,看了也不会明白多少的…)
    下面都统一用RBTree表示红黑树。
    RBTree很多人都觉得难,其实我刚听到的时候也觉得难。因为大家都说难。。。哈哈~开个玩笑
    RBTree其实并没有说的那么难,RBTree是23Tree的变种版本。
    所以正常的学习流程应该是先从23Tree学起,然后再去理解红黑树就是一件非常简单的事情了。
    RBTree是Robert Sedgewick 这位老哥发明,他老师是唐纳德有兴趣可以搜搜唐纳德是何人。
    我这篇博客仅仅只是翻译一点Robert Sedgewick的文档。
    这是PDF地址看了这个基本懂了
    RedBlack.pdf
    红黑树数据结构在线演示
    其他数据结构及算法
    美团红黑树博客
    美团的这篇写的不错,但是我觉得并不是给人看的。讲的那么复杂干嘛。。。。

2-3树介绍

首先需要明白理解23树对于理解红黑树和B树都是有好处。
那么23树是什么?
23树满足二分搜索树的基本性质。
我们看23树的key的种类。
2-node: one key, two children.一个key值,两个儿子节点
3-node: two keys, three children。两个key值,三个儿子节点
当超过3个node的时候会进行树重构,节点上升。
23树的基本定义就是上面这些了。
那么23树的查找怎么做了?
1.比较要查找的key与当前节点中的key值
2.根据key值选择要查找的key所存在的子树区间
3.重复上述步骤(递归实现),直到查找到key
插入的步骤怎么做了?
首先,如果是向一个2-node插入节点的话,那么直接将它转换为3-node就可以了
然后,如果向3-node插入怎么办了?此时已经达到了节点最大值,无法插入数据了。只能做节点变换,一般直接将中间的节点上移到父节点此时就可以插入数据了。
如果不清楚的话先看看上面的PDF中的234树,因为主要讲红黑树

红黑树

这边我要实现的红黑树是一个左倾红黑树,也是相对传统红黑树个人觉得升级的更简洁的红黑树。
首先我们看一下红黑树的定义
1.每个节点或者是黑色,或者是红色。
2.根节点是黑色。
3.每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
4.如果一个节点是红色的,则它的子节点必须是黑色的。
5.从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点
下面看一张红黑树的实例图(绝对的标准!!!!)
avatar
上面的是传统的红黑树而我们要实现的是左倾的红黑树。
与上面仅仅多了一个条件
所有的红色Node都在左边。
看一下具体的实现如下图。
借用一下liuyubobobo波波老师的PPT截了一张图。(懒得画了~哈哈)
avatar
看图肯定觉得传统红黑和左倾里面数据都不一样的位置了。
但是可以保证的是左倾实现代码没有传统复杂并且功能一样,有什么理由拒绝了?
下面咱们自己实现一个红黑树。
首先我参考了Doug Lea的代码也参考了Robert Sedgewick顺带的也参考了bobo老师的代码
bobo老师参考的Robert Sedgewick
他们三个人实现了还是有些细节区别。
比如Robert Sedgewick和bobo都喜欢用递归。
Doug Lea喜欢用死循环。
这些都是有原因的,个人还是觉得Doug Lea更偏向于生产代码。
比较递归层次多一点就stackoverflow了,不过递归也有好处代码简洁写起来也简单。
所以我的代码循环和递归都会用~
我想了一下我还是在代码里面添加注释的方式讲解好了。



/**
 * @ClassName LRBTree
 * @Description ToDo
 * @Author Allen
 * @Date 2018/12/16 3:01
 * @Version
 */
public class LRBTree<K extends Comparable <K>, V> {
   

    private final RBTreeBase <K, V> rbTree;

    abstract static class RBTreeBase<K extends Comparable <K>, V> {
   
        //红黑常量
        private static final boolean RED = true;
        private static final boolean BLACK = false;
        private Node <K, V> root;
        private int size;

        RBTreeBase() {
   
            root = null;
            size = 0;
        }

        V get(K key) {
   
            Node <K, V> node = findNode(key);
            return node == null ? null : node.value;
        }

        void put(K key, V value) {
   
            Node <K, V> node = addNode(getRoot(), key, value);
            setRoot(node);//因为默认添加的元素都是红色,当root元素的时候需要颜色翻转为黑
        }


        abstract Node <K, V> findNode(K key);

        abstract Node <K, V> addNode(Node <K, V> node, K key, V value);


        abstract V delete();

        protected int getSize() {
   
            return size;
        }

        protected int setSize() {
   
            return size++;
        }

        protected boolean isEmpty() {
   
            return size == 0;
        }

        protected Node <K, V> getRoot() {
   
            return root;
        }
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
智慧农业是一种结合了现代信息技术,包括物联网、大数据、云计算等,对农业生产过程进行智能化管理和监控的新模式。它通过各种传感器和设备采集农业生产中的关键数据,如大气、土壤和水质参数,以及生物生长状态等,实现远程诊断和精准调控。智慧农业的核心价值在于提高农业生产效率,保障食品安全,实现资源的可持续利用,并为农业产业的转型升级提供支持。 智慧农业的实现依赖于多个子系统,包括但不限于设施蔬菜精细化种植管理系统、农业技术资料库、数据采集系统、防伪防串货系统、食品安全与质量追溯系统、应急追溯系统、灾情疫情防控系统、农业工作管理系统、远程诊断系统、监控中心、环境监测系统、智能环境控制系统等。这些系统共同构成了一个综合的信息管理和服务平台,使得农业生产者能够基于数据做出更加科学的决策。 数据采集是智慧农业的基础。通过手工录入、传感器自动采集、移动端录入、条码/RFID扫描录入、拍照录入以及GPS和遥感技术等多种方式,智慧农业系统能够全面收集农业生产过程中的各种数据。这些数据不仅包括环境参数,还涵盖了生长状态、加工保存、检验检疫等环节,为农业生产提供了全面的数据支持。 智慧农业的应用前景广阔,它不仅能够提升农业生产的管理水平,还能够通过各种应用系统,如库房管理、无公害监控、物资管理、成本控制等,为农业生产者提供全面的服务。此外,智慧农业还能够支持政府监管,通过发病报告、投入品报告、死亡报告等,加强农业产品的安全管理和质量控制。 面对智慧农业的建设和发展,存在一些挑战,如投资成本高、生产过程标准化难度大、数据采集和监测的技术难题等。为了克服这些挑战,需要政府、企业和相关机构的共同努力,通过政策支持、技术创新和教育培训等手段,推动智慧农业的健康发展。智慧农业的建设需要明确建设目的,选择合适的系统模块,并制定合理的设备布署方案,以实现农业生产的智能化、精准化和高效化。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值