数据结构——红黑树(hashmap底层实现)(更新中)

学无止境 Java工程师的进阶之旅

树前置基础知识

1、什么是树

是一种抽象数据类型(ADT),用来模拟具有树状结构性质的数据集合,他是由n个有限节点通过连接它们的组成的一个具有层次关系的集合
每个节点最多只能有两个子节点的称为二叉树
在这里插入图片描述

2、常用术语

在这里插入图片描述

3、二叉搜索树

1、定义
要求:
1、若左子树不空,则左子树的所有节点均小于根节点
2、若右子树不空,则左子树的所有节点均大于根节点
3、它的左右子树分别为二叉排序树
在这里插入图片描述

2、操作
1、查找节点
在这里插入图片描述
2、插入节点
在这里插入图片描述
3、遍历节点
遍历树是根据一种特定的顺序访问树的每一个节点。二叉搜索树采用中序遍历
在这里插入图片描述
4、查找最大值和最小值
最小值:一直找左节点
最大值:一直找右节点
在这里插入图片描述
5、删除节点

  1. 该节点是叶节点(没有子节点)
  2. 该节点有一个子节点
  3. 该节点有两个子节点

5.1、删除没有子节点的节点
要删除叶节点,只需要改变该节点的父节点引用该节点的值,即将引用改为null即可
在这里插入图片描述
5.2、删除有一个子节点的节点
只需要将父节点原本指向该节点的引用,改为指向该节点的子节点即可
在这里插入图片描述
5.3、删除有两个子节点的节点
用后继节点代替删除的节点
后继节点:大于该节点的最小节点
在这里插入图片描述
5.4、逻辑删除
通过上面的分类讨论,我们发现删除挺复杂,其实可以给每个节点标识字段isDelete,当该字段为true时,标识该节点已删除,这样删除节点就不会改变树的结构

3、时间复杂度

1、回顾二分查找算法
[1,2,3,4,5,6,7,8,9。。。。。100]
数据源必须是有序数组,每次迭代查询可以排除一半的结果

public static int binarySearch(int[] arr, int data) {
    int low = 0;
    int height = arr.length - 1;

    while (low <= height) {
        int mid = (low + height) / 2;

        if (arr[mid] < data) {
            low = mid + 1;
        } else if (arr[mid] == data) {
            return mid;
        } else {
            height = mid - 1;
        }
    }
    return -1;
}

2、二分查找算法缺陷
必须依赖有序数组才有高性能

3、数组缺陷
没有办法快速插入,没有办法扩容

4、二分查找算法怎么样才能有高性能又有链表的高灵活性
二叉搜索树!!

5、二分查找算法时间复杂度
在这里插入图片描述
6、普通二叉搜索树的致命缺陷
在这里插入图片描述
6、解决二叉搜索树退化成线性链表的问题
如果插入元素时,树可以自动保持平衡,会保持不错的查找性能

AVL树:
1、具有二叉查找树的所有特性
2、每个节点的左子树和右子树的高度差至多等于1
平衡树基于这种特点就可以保证不会出现大量节点偏向一边的情况(插入或者删除时,会发生左旋,右旋操作,使这棵树保持一定的平衡)
在这里插入图片描述
在这里插入图片描述

红黑树

1、原理讲解

红黑树并不是一个完美平衡二叉树,但左右子树的黑节点层数是相等的,也即任意一个节点到每个叶子节点的路径都包含数量相同的黑节点。所以我们叫红黑树这种平衡为黑色完美平衡
在这里插入图片描述
在这里插入图片描述
左旋图示
在这里插入图片描述
右旋图示
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Laptoy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值