JDK1.8的HashMap底层红黑树实现

今天看了小刘老师讲的红黑树,看完后茅塞顿开,受益匪浅,于是我打算写一篇博客记录一下今天所学,本文章大多来自小刘老师的笔记,以及部分自己的见解

在这里插入图片描述

什么是树

在学习红黑树之前,我们先来复习一下什么是树

**树(tree)**是一种抽象数据类型(ADT),用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限节点通过连接它们的边组成一个具有层次关系的集合。
把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。
树有很多种,向上面的一个节点有多余两个的子节点的树,称为多路树,而每个节点最多只能有两个子节点的一种形式称为二叉树。
在这里插入图片描述

  • 节点:上图的圆圈,比如A,B,C等都是表示节点。节点一般代表一些实体,在java面向对象编程中,节点一般代表对象。
  • 边:连接节点的线称为边,边表示节点的关联关系。一般从一个节点到另一个节点的唯一方法就是沿着一条顺着有边的道路前进。在Java当中通常表示引用。

树结构常用术语

在这里插入图片描述

  • 路径:顺着节点的边从一个节点走到另一个节点,所经过的节点的顺序排列就称为“路径”。
  • 根:树顶端的节点称为根。一棵树只有一个根,如果要把一个节点和边的集合称为树,那么从根到其他任何一个节点都必须有且只有一条路径。A是根节点。
  • 父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点
  • 子节点:一个节点含有的子树的节点称为该节点的子节点;F、G是C节点的子节点。
  • 兄弟节点:具有相同父节点的节点互称为兄弟节点;F、G节点互为兄弟节点。
  • 叶节点:没有子节点的节点称为叶节点,也叫叶子节点,比如上图的H、E、F、G都是叶子节点。
  • 子树:每个节点都可以作为子树的根,它和它所有的子节点、子节点的子节点等都包含在子树中。
  • 节点的层次:从根开始定义,根为第一层,根的子节点为第二层,以此类推。
  • 深度:对于任意节点n,n的深度为从根到n的唯一路径长,根的深度为0;(从上往下看)
  • 高度:对于任意节点n,n的高度为从n到一片树叶的最长路径长,所有树叶的高度为0;(从下往上看)

二叉搜索树

二叉树:树的每个节点最多只能有两个子节点。

在这里插入图片描述
上图的第一幅图B节点有DEF三个子节点,就不是二叉树,称为多路树

而第二幅图每个节点最多只有两个节点,是二叉树,并且二叉树的子节点称为“左子节点”和“右子节点”

二叉搜索树:

如果我们给二叉树加一个额外的条件,就可以得到一种被称作二叉搜索树(binary search tree)的特殊二叉树。

二叉搜索树要求:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
它的左、右子树也分别为二叉排序树。
在这里插入图片描述

二叉搜索树-查找节点:

查找某个节点,我们必须从根节点开始查找。

  • 查找值比当前节点值大,则搜索右子树;
  • 查找值等于当前节点值,停止搜索(终止条件);
  • 查找值小于当前节点值,则搜索左子树;

二叉搜索树-插入节点:

要插入节点,必须先找到插入的位置。与查找操作相似,由于二叉搜索树的特殊性,

待插入的节点也需要从根节点开始进行比较,小于根节点则与根节点左子树比较,

反之则与右子树比较,直到左子树为空或右子树为空,则插入到相应为空的位置。

二叉搜索树-遍历节点:

遍历树是根据一种特定的顺序访问树的每一个节点。比较常用的有前序遍历,中序遍历和后序遍历。而二叉搜索树最常用的是中序遍历。

  • 中序遍历:左子树——>根节点——>右子树
  • 前序遍历:根节点——>左子树——>右子树
  • 后序遍历:左子树——>右子树——>根节点
    在这里插入图片描述

二叉搜索树-查找最大值和最小值

要找最小值,先找根的左节点,然后一直找这个左节点的左节点,直到找到没有左节点的节点,那么这个节点就是最小值。
同理要找最大值,一直找根节点的右节点,直到没有右节点,则就是最大值。

在这里插入图片描述

二叉搜索树-删除节点:

删除节点是二叉搜索树中最复杂的操作,删除的节点有三种情况,前两种比较简单,但是第三种却很复杂。

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Code_BinBin

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

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

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

打赏作者

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

抵扣说明:

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

余额充值