红黑树简单了解

作者: 右耳菌 | 来源:发表于2022-06-21 17:56 被阅读0次

先引入一个问题:

假设有一个大小为10, 000的数组,按大小进行排序,如 【1,3,8,15...】,假设我要在这个数组中查询是否存在 888 这个数字,那么这个算法我们要怎么写呢?

当然肯定有人会说,写个循环遍历一下不就好了吗?
这种做法不能说是错的,但是却不是最好的方法。

这里使用二分查找法的话,效率会更高的。

什么是二分查找法?

【内容来自百度百科】二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

以上的说法可能不够明确,我们来用上边的数组举个例子:

  1. 我们首先将这个 10,000 大小的数组平均(大致平均,可能存在正负1的偏差)切分为两部分 也就是下标为 0 ~ 4999, 5000 ~ 9999
  2. 取其中下标为5000的记录与 888 对比大小,如果等于则直接返回
  3. 如果小于则对 0 ~ 4999 的部分继续执行切分比对的操作
  4. 如果大于则对 5000 ~ 9999 的部分继续执行切分比对的操作

以上就是二分查找法的思想。

  • 时间复杂度 为 O(log2n)
public static int binarySearch(Integer[] srcArray, int des) {
    //定义初始最小、最大索引
    int start = 0;
    int end = srcArray.length - 1;
    //确保不会出现重复查找,越界
    while (start <= end) {
        //计算出中间索引值
        int middle = (end + start)>>>1 ;//防止溢出
        if (des == srcArray[middle]) {
            return middle;
        //判断下限
        } else if (des < srcArray[middle]) {
            end = middle - 1;
        //判断上限
        } else {
            start = middle + 1;
        }
    }
    //若没有,则返回-1
    return -1;
}

二叉树简单了解

【 内容来自百度百科】二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树。

二叉树是遵循了一定的规则生成的一种数据结构,比如它的左子树的元素比根节点的元素要小,右子树的元素比根节点的元素要大。


二叉树的例子

但是对于这个二叉树,虽然可以方便地判定是我要找某一个数据的时候,需要往左边找还是右边找,但是显然会有一种特殊的情况,当插入的顺序在某一段时间内是按照大小顺序插入的时候,就会导致某二叉树不平衡

不平衡的二叉树

显然对于不平衡的二叉树,会导致查找的效率大大降低。

红黑树简单说明

【来自百度百科】红黑树(Red Black Tree) 是一种自平衡二叉查找树,它是在计算机科学中用来组织数据比如数字的块的一种结构。

红黑树是一种平衡二叉查找树的变体,它的左右子树高差有可能大于 1,所以红黑树不是严格意义上的平衡二叉树(AVL),但 对之进行平衡的代价较低, 其平均统计性能要强于 AVL 。 [2]

由于每一棵红黑树都是一颗二叉排序树,因此,在对红黑树进行查找时,可以采用运用于普通二叉排序树上的查找算法,在查找过程中不需要颜色信息。 [5]

在线演示网址-中文
在线演示网址-英文

  • 演示 插入 1,2,3,4,5





红黑树定律:

(1)每个节点或者是黑色,或者是红色。
(2)根节点是黑色。
(3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
(4)如果一个节点是红色的,则它的子节点必须是黑色的。
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。


如果觉得有收获就点个赞吧,更多知识,请点击关注查看我的主页信息哦~

相关文章

  • 红黑树简单了解

    先引入一个问题: 假设有一个大小为10, 000的数组,按大小进行排序,如 【1,3,8,15...】,假设我要在...

  • TreeMap

    需要先了解红黑树,这是之前分析红黑树的文章。之前在分析红黑树时,我认为红黑树=二叉查找树+红黑平衡,关于二叉查找树...

  • JDK1.8 之 集合框架 TreeMap TreeSet

    了解 Tree 之前我们必须了解 红黑树 因为Tree 的数据结构就是红黑树 红黑树的特性(1)每个节点或者是黑色...

  • 拿下红黑树

    红黑树 红黑树、2-3树的简单定义: 实现红黑树的基本结构以及添加操作(维护定义,左旋、右旋、颜色反转) 红黑树与...

  • java - 红黑树 - 特殊的二叉查找树

    R-B Tree,成为红黑树,每个节点上都有存储表示节点颜色的标记 大概了解一下的,只是简单介绍一下红黑树特点,不...

  • Java集合源码分析之Map(四):TreeMap

    TreeMap是红黑树的java实现,对红黑树不太了解的可以查阅这篇文章Java集合源码分析之基础(六):红黑树(...

  • Java 基础之数据结构:树

    现在面试问 MySQL、红黑树好像都是必备问题了。动不动就让手写红黑树或者简单介绍下红黑树。然而,我们如果直接去看...

  • 数据结构及算法

    红黑树的了解(平衡树,二叉搜索树),使用场景 红黑树在STL上的应用 了解并查集吗?(低频) 贪心算法和动态规划的...

  • 关于红黑树

    hashmap中的处理有红黑树的参与,我了解了一下红黑树 红黑树 并不追求“完全平衡 ”——它只要求部分地达到平衡...

  • java8中hashmap源码分析,put()方法详细分析

    一.源码大纲 1.了解红黑树原理(可翻看上一个文章,[红黑树原理分析](数据结构红黑树添加、修改原理分析 - 简书...

网友评论

    本文标题:红黑树简单了解

    本文链接:https://www.haomeiwen.com/subject/xajevrtx.html