Chiriri's blog Chiriri's blog
首页
  • Java

    • JavaSE
    • JavaEE
    • 设计模式
  • Python

    • Python
    • Python模块
    • 机器学习
  • Golang

    • Golang
    • gRPC
  • 服务器

    • Linux
    • MySQL
    • NoSQL
    • Kubernetes
  • 项目

    • 传智健康
    • 畅购商城
  • Hadoop生态

    • Hadoop
    • Zookeeper
    • Hive
    • Flume
    • Kafka
    • Azkaban
    • Hbase
    • Scala
    • Spark
    • Flink
  • 大数据项目

    • 离线数仓
  • 青训营

    • 第四届青训营
  • HTML

    • HTML
    • JavaScript
  • Vue

    • Vue2
    • TypeScript
    • Vue3
    • Uni-APP
  • 数据结构与算法
  • C语言
  • 考研数据结构
  • 计算机组成原理
  • 计算机操作系统
  • Java基础

    • Java基础
    • Java集合
    • JUC
    • JVM
  • 框架

    • Spring
    • Dubbo
    • Spring Cloud
  • 数据库

    • MySQL
    • Redis
    • Elasticesearch
  • 消息队列

    • RabbitMQ
    • RocketMQ
  • 408

    • 计算机网络
    • 操作系统
    • 算法
  • 分类
  • 标签
  • 归档
  • 导航站
GitHub (opens new window)

Iekr

苦逼后端开发
首页
  • Java

    • JavaSE
    • JavaEE
    • 设计模式
  • Python

    • Python
    • Python模块
    • 机器学习
  • Golang

    • Golang
    • gRPC
  • 服务器

    • Linux
    • MySQL
    • NoSQL
    • Kubernetes
  • 项目

    • 传智健康
    • 畅购商城
  • Hadoop生态

    • Hadoop
    • Zookeeper
    • Hive
    • Flume
    • Kafka
    • Azkaban
    • Hbase
    • Scala
    • Spark
    • Flink
  • 大数据项目

    • 离线数仓
  • 青训营

    • 第四届青训营
  • HTML

    • HTML
    • JavaScript
  • Vue

    • Vue2
    • TypeScript
    • Vue3
    • Uni-APP
  • 数据结构与算法
  • C语言
  • 考研数据结构
  • 计算机组成原理
  • 计算机操作系统
  • Java基础

    • Java基础
    • Java集合
    • JUC
    • JVM
  • 框架

    • Spring
    • Dubbo
    • Spring Cloud
  • 数据库

    • MySQL
    • Redis
    • Elasticesearch
  • 消息队列

    • RabbitMQ
    • RocketMQ
  • 408

    • 计算机网络
    • 操作系统
    • 算法
  • 分类
  • 标签
  • 归档
  • 导航站
GitHub (opens new window)
  • JavaSE

    • Java简介
    • 基础语法
    • 数据类型
    • 变量
    • 运算符
    • 输入输出
    • 流程控制
    • 循环语句
    • idea中的辅助键
    • 数组
    • 方法
    • 面向对象基础
    • 字符串
    • ArrayList集合
    • 继承
    • 修饰符
    • 多态
    • 抽象
    • 接口
    • 类名作为形参和返回值
    • 内部类
    • Api
    • 异常
    • 集合
    • 泛型
    • Set集合和比较器
    • 树
      • 二叉树
      • 二叉查找树
        • 添加节点
      • 平衡二叉树
        • 左旋
        • 如果被提级的节点已有左节点
        • 右旋
        • 左左
        • 右右
        • 右右
        • 右左
      • 红黑树
        • 红黑规则
        • 添加节点
        • 当父节点也是红色,叔叔节点也是红色
        • 当父节点也是红色,叔叔节点是黑色
        • 总结
      • TreeSet遍历
    • 哈希
    • 可变参数
    • 创建不可变的集合
    • Stream流
    • 方法引用
    • File
    • 多线程
    • 多线程高级
    • 网络编程
    • 类加载器
    • 反射
    • XML
    • 枚举
    • 注解
    • 单元测试
    • 日志
    • HTTP协议
    • Servlet
    • 请求对象
    • 响应对象
    • Cookie
    • Session
    • JSP
    • Listener
    • JDBC
  • JavaEE

  • Linux

  • MySQL

  • NoSQL

  • Python

  • Python模块

  • 机器学习

  • 设计模式

  • 传智健康

  • 畅购商城

  • 博客项目

  • JVM

  • JUC

  • Golang

  • Kubernetes

  • 硅谷课堂

  • C

  • 源码

  • 神领物流

  • RocketMQ

  • 短链平台

  • 后端
  • JavaSE
Iekr
2021-07-23
目录

树

# 树

# 二叉树

每个个节点存放 4 个属性分别为 父节点地址 值 左子节点地址 右子节点地址

度:每个节点的子节点数量 左右子节点的总数

在二叉树中,任意一个节点的度要小于等于 2

查找效率慢

# 二叉查找树

二叉查找树,又称二叉排序树或二叉搜索树

特点:

  1. 每个节点最多有两个子节点
  2. 每个节点的左子结点都是小于自身的
  3. 每个节点的右子结点都是大于自身的

查找效率比普通二叉树快

# 添加节点

规则:

  1. 小的存左边
  2. 大的存右边
  3. 一样的不存

首先与根节点做比较,再逐层比较

查询效率比二叉查找树快

# 平衡二叉树

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

# 左旋

当添加一个节点破坏了平衡二叉树规则时,并且是添加在根节点右边,我们可以通过左旋来恢复平衡二叉树.

只需要把根节点向左下方拉扯,并且连接的所有节点跟着移动即可.

当添加 12 节点时破坏了平衡二叉树了

image-20210723072123043

我们通过左旋来恢复平衡,把根节点的右子节点往上拉

image-20210723072628472

# 如果被提级的节点已有左节点

image-20210723073135301

先忽略左子节点存在,再提级,然后放置在原先的根节点的右子节点

image-20210723073156321

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

这里写图片描述

# 右旋

这里写图片描述

右旋:将根节点的左侧往右拉,左子节点变成了新的父节点,并把多余的右子节点出让,给已经降级根节点当左子节点

# 左左

当根节点左子树的左子树有节点插入,导致二叉树不平衡

我们只需要将此二叉树右旋既可

image-20210723080834880

# 右右

当根节点左子树的右子树有节点插入,导致二叉树不平衡

我们发现单单靠一次的右旋是无法恢复平衡状态

image-20210723080914937

image-20210723080959156

我们需要将 5 当为根节点 左旋一次

image-20210723081043559

再由根节点 7 右旋一次

image-20210723081116012

# 右右

当根节点右子树的右子树有节点插入,导致二叉树不平衡

我们只需要将此二叉树左旋既可

image-20210723083959803

# 右左

当根节点右子树的左子树有节点插入,导致二叉树不平衡

我们发现单单靠一次的左旋是无法恢复平衡状态

image-20210723084119255

把 10 当为根节点,右旋一次

image-20210723084425042

再以根节点 左旋

image-20210723084405696

# 红黑树

红黑树又称平衡二叉 B 树

它是一种特色的二叉查找树,红黑树的每个节点上都有存储位表示节点的颜色

每一个节点可以是红或黑;红黑树不是高度平衡的,它的平衡是通过 "红黑规则" 进行实现的

而平衡二叉树是高度平衡的,当左右子树高度差超过 1 时则触发旋转

而红黑树是根据定于的红黑规则触发旋转的

# 红黑规则

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

# 添加节点

添加节点时,默认为红色,效率比为黑色要高

并遵循二叉查找树的规则

# 当父节点也是红色,叔叔节点也是红色

因为默认是添加红色,如果父节点为红色,叔叔节点也为红色

  1. 父节点改为黑色
  2. 叔叔 (祖父节点的左 / 右子节点) 节点改为黑色
  3. 将祖父节点改为红色
  4. 如果祖父节点为根节点则重新变回黑色

# 当父节点也是红色,叔叔节点是黑色

  1. 将父节点改为黑色
  2. 将祖父节点改为红色
  3. 以祖父节点为支点进行旋转
    • 左节点大于则右旋
    • 右节点大于则左旋
    • 可以把 Nil 先忽略,旋转完后再加回叶节点,比较好理解

# 总结

image-20210723094236460

# TreeSet 遍历

先获取左边,再获取中间,再获取右边

编辑 (opens new window)
上次更新: 2023/12/06, 01:31:48
Set集合和比较器
哈希

← Set集合和比较器 哈希→

最近更新
01
k8s
06-06
02
进程与线程
03-04
03
计算机操作系统概述
02-26
更多文章>
Theme by Vdoing | Copyright © 2022-2025 Iekr | Blog
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式