在集合中常见的数据结构

, Read in about 4 min

Posted by Ryen on Friday, September 11, 2020
With final update in December 26,2023

本文总阅读量

常见的数据结构

1.栈

先进后出–>装子弹

在这里插入图片描述

2.队列

先进先出–>过安检

在这里插入图片描述

3.数组

  • 查找元素快:通过索引,可以快速访问指定位置的元素。
  • 增删元素慢:–>数组定长,改变数组长度的话,需要创建新的数组。

4.链表

  • 查找元素慢:想查找某个元素,需要通过连接的节点,依次向后查找指定元素
  • 增删元素快:
    单向链表:前面的记录后面的地址,后面的不记录前面的地址
    双向链表:前面的记录后面的,后面也记录前面的

在这里插入图片描述

5.二叉树

  • 二叉树的特点
    • 二叉树中,任意一个节点的度要小于等于2
      • 节点: 在树结构中,每一个元素称之为节点
      • 度: 每一个节点的子节点数量称之为度
  • 二叉树结构图

在这里插入图片描述

6.二叉查找树(二叉搜索树)

  • 二叉查找树的特点
    • 二叉查找树,又称二叉排序树或者二叉搜索树
    • 每一个节点上最多有两个子节点
    • 左子树上所有节点的值都小于根节点的值
    • 右子树上所有节点的值都大于根节点的值
  • 二叉查找树结构图

在这里插入图片描述

  • 二叉查找树和二叉树对比结构图

在这里插入图片描述

  • 二叉查找树添加节点规则
    • 小的存左边
    • 大的存右边
    • 一样的不存

在这里插入图片描述

7.平衡二叉树

  • 平衡二叉树的特点

    • 二叉树左右两个子树的高度差不超过1
    • 任意节点的左右两个子树都是一颗平衡二叉树
  • 平衡二叉树旋转

    • 旋转触发时机

      • 当添加一个节点之后,该树不再是一颗平衡二叉树
    • 左旋

      • 就是将根节点的右侧往左拉,原先的右子节点变成新的父节点,并把多余的左子节点出让,给已经降级的根节点当右子节点

      在这里插入图片描述

    在这里插入图片描述

    • 右旋

      • 就是将根节点的左侧往右拉,左子节点变成了新的父节点,并把多余的右子节点出让,给已经降级根节点当左子节点 在这里插入图片描述
        在这里插入图片描述
    • 平衡二叉树和二叉查找树对比结构图
      在这里插入图片描述

    • 平衡二叉树旋转的四种情况

      • 左左

        • 左左: 当根节点左子树的左子树有节点插入,导致二叉树不平衡
        • 如何旋转: 直接对整体进行右旋即可
          在这里插入图片描述
      • 左右

        • 左右: 当根节点左子树的右子树有节点插入,导致二叉树不平衡
        • 如何旋转: 先在左子树对应的节点位置进行左旋,在对整体进行右旋

        在这里插入图片描述

      • 右右

        • 右右: 当根节点右子树的右子树有节点插入,导致二叉树不平衡
        • 如何旋转: 直接对整体进行左旋即可

      在这里插入图片描述

      • 右左

        • 右左:当根节点右子树的左子树有节点插入,导致二叉树不平衡
        • 如何旋转: 先在右子树对应的节点位置进行右旋,在对整体进行左旋

        在这里插入图片描述

8.红黑树

  • 红黑树的特点

    • 平衡二叉B树
    • 每一个节点可以是红或者黑
    • 红黑树不是高度平衡的,它的平衡是通过"自己的红黑规则"进行实现的
  • 红黑树的红黑规则有哪些

    1. 每一个节点或是红色的,或者是黑色的
    2. 根节点必须是黑色
    3. 如果一个节点没有子节点或者父节点,则该节点相应的指针属性值为Nil,这些Nil视为叶节点,每个叶节点(Nil)是黑色的
    4. 如果某一个节点是红色,那么它的子节点必须是黑色(不能出现两个红色节点相连 的情况)
    5. 对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点

    在这里插入图片描述

  • 红黑树添加节点的默认颜色

    • 添加节点时,默认为红色,效率高

    在这里插入图片描述

  • 红黑树添加节点后如何保持红黑规则

    • 根节点位置
      • 直接变为黑色
    • 非根节点位置
      • 父节点为黑色
        • 不需要任何操作,默认红色即可
      • 父节点为红色
        • 叔叔节点为红色
          1. 将"父节点"设为黑色,将"叔叔节点"设为黑色
          2. 将"祖父节点"设为红色
          3. 如果"祖父节点"为根节点,则将根节点再次变成黑色
        • 叔叔节点为黑色
          1. 将"父节点"设为黑色
          2. 将"祖父节点"设为红色
          3. 以"祖父节点"为支点进行旋转

在这里插入图片描述

9.哈希表

  • 哈希值简介1.是由计算机算出来的一个十进制,理解为对象的地址值(逻辑地址)内存中分配给对象的地址值和哈希值没啥关系2.是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值哈希表介绍 在这里插入图片描述

  • 如何获取哈希值​ Object类中的public int hashCode():返回对象的哈希码值

  • 哈希值的特点

    • 同一个对象多次调用hashCode()方法返回的哈希值是相同的
    • 默认情况下,不同对象的哈希值是不同的。而重写hashCode()方法,可以实现让不同对象的哈希值相同
  • 哈希表的存储过程 在这里插入图片描述

  • 结论:

    • String中的hashCode方法,获取的是字符串内容的哈希值
    • 内容一样(equals),哈希值(hashCode)一定一样​ 内容不一样,哈希值也有可能一样
  • JDK1.8以前

    • ​ 数组 + 链表 在这里插入图片描述
  • JDK1.8以后

    • 节点个数少于等于8个数组 + 链表
    • 节点个数多于8个数组 + 红黑树

    在这里插入图片描述

转载自CSDN 总结的挺全的

「真诚赞赏,手留余香」

Ryen's Blog

真诚赞赏,手留余香

使用微信扫描二维码完成支付