【数据结构】--二叉树,红黑树

article/2025/10/1 4:04:35

【数据结构】--二叉树,红黑树

  • 🏆概念
    • 🍍定义
    • 🍋 术语
    • 📝可视化网站
  • ☀️二叉树
  • ✨ 二叉搜索树
    • 🍍定义
    • 🍑查找节点
    • 🍋插入节点
    • 🍅遍历节点
      • 🍕 前序排序
      • 🧀 后序排序
      • 🍟 中序排序
    • 🍇删除节点
      • 🍖删除无子节点的节点
      • 🌺删除有一个子节点的节点
      • 🔥删除有两个子节点的节点
    • ⭐️时间复杂度分析
      • 🐈二分查找算法的
    • 🎉缺陷
  • ⭐️平衡二叉树(AVL树)
  • 🔥 红黑树
    • ✌变色
    • 🎄左旋
    • 🎄右旋
  • 🔎参考博客


🏆概念

🍍定义

树:N个节点构成的有限结合,树中有一个称为“根”的特殊节点。其余节点分为互不相交的“子树”。
在这里插入图片描述

🍋 术语

  • 节点:以图为例,11,20.41 …都是节点。
  • 边:节点与节点之间的连线为边。
  • 根:树顶端的节点为根节点。一棵树只有一个根节点。
  • 节点相对关系: 11是20的子节点;20是11的父节点;29是11的兄弟节点。
  • 叶子节点:没有子节点的节点,例如11。
  • 度:树中一个节点的孩子个数称为该结点的度,树中节点的最大度数称为树的度。例如:20的度为2;(孩子节点为11,29)
  • 高度:从下往上看,从节点到叶子节点的最长路径。从0开始计数。所有叶子节点的高度为0.例如:20节点的高度为:2;
  • 深度:从上往下看,从根节点到任意节点的路径长度。从0开始计数。根节点深度为0.例如:29的深度为:2;
  • 层次:从上往下看,从1开始计数。根节点层次为1.

有的资料对于高度深度从0还是1开始计数定义不同,可参考树的高度和深度

树的性质
在这里插入图片描述————————————————
版权声明:本文为CSDN博主「UniqueUnit」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Real_Fool_/article/details/113930623

📝可视化网站

🔎visualgo
在这里插入图片描述
🔎usfca
在这里插入图片描述

☀️二叉树

树的每个节点最多只能有两个子节点.(二叉树中不存在度大于2的结点);二叉树的子树有左右之分,其次序不能任意颠倒。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

✨ 二叉搜索树

🍍定义

在二叉树的基础上,加一个额外的条件,可以得到特殊的二叉树,二叉搜索树

二叉搜索树要求:

  • 若左子树不为空,则左子树所有节点的值均小于它的根节点;
  • 若右子树不为空,则右子树所有节点的值均大于它的根节点;
  • 左右子树为二叉排序树

🍑查找节点

查找某个节点,必须从根节点开始查找;
查找值比当前节点值大,则搜索右子树;
查找值等于当前节点值,停止搜索;
查找值小于当前节点值,则搜索左子树;
在这里插入图片描述

🍋插入节点

类似于查找,拿插入值与当前节点值比较
小于向左,大于向右
直到左子树或者右子树为空时插入数据。
在这里插入图片描述

🍅遍历节点

遍历树按照特定的顺序访问每个节点。分为:前序遍历,中序遍历,后序遍历。

二叉搜索树常用为:中序遍历。

🍕 前序排序

如果二叉树为空,则空操作;否则依次执行以下操作。

  1. 访问根结点
  2. 先序遍历根结点的左子树
  3. 先序遍历根结点的右子树

结果为:41,20,11,29,28,32,65,50,91,72,99
在这里插入图片描述

🧀 后序排序

如果二叉树为空,则空操作;否则依次执行以下操作。

  1. 后序遍历根结点的左子树
  2. 后序遍历根结点的右子树
  3. 访问根节点

结果为:11,28,32,29,20,50,72.99.91,65,41
提示:目前网站不支持后序排序动画;

🍟 中序排序

如果二叉树为空,则空操作;否则依次执行以下操作。

  1. 中序遍历根结点的左子树
  2. 访问根结点
  3. 中序遍历根结点的右子树
    结果为:11,20,29,32,41,50,65,72,91,99
    在这里插入图片描述

🍇删除节点

删除节点情况比较多

🍖删除无子节点的节点

只需要改变节点的父节点引用该节点的值,即:将其引用改为null.
在这里插入图片描述

🌺删除有一个子节点的节点

需要将该节点的父节点指向该节点的引用指向该节点的子节点

在这里插入图片描述

🔥删除有两个子节点的节点

需要找删除节点的后继节点,用后继节点代替删除的节点;
后继节点:大于节点的最小节点。
在这里插入图片描述

⭐️时间复杂度分析

🐈二分查找算法的

数组[1,2,3…100]

  • 暴力算法:遍历数组查找性能不稳定,取决于查找元素位置。
  • 二分查找算法:数据源必须是有序数组,性能优异,每次迭代排除数据的一半。
public static void main(String[] args) {int[] arr=new int[]{0,1,2,3,4,5,6,7,8,9,10};System.out.println(binarySerrch(arr,1));}public static int binarySerrch(int[] arr,int data){int begin=0;int end=arr.length-1;while (begin<=end){//起始位加上中间长度,获取中间位置下标int mid=begin+(end-begin)/2;System.out.println("中间位置-->"+mid);if (arr[mid]<data){begin=mid+1;}else if (arr[mid]==data){return mid;}else {end=mid-1;}}return -1;}

二分查找缺陷:强制依赖有序数组

数组缺陷:不能快速插入,不能灵活扩容

链表可以弥补数组缺陷

📜综上,二分查找如何才能既要高性能,又要链表一样灵活。可以使用二叉搜索树来使用。

二分查找时间复杂度为:
N/(2 ^ K)=1 => (2 ^ K)=N => K=log2(N) => O(logN)

🎉缺陷

这样的二叉树就退化为了链表。 此时时间复杂度为:O(N)
在这里插入图片描述

⭐️平衡二叉树(AVL树)

  • 具有二叉树全部特征。
  • 每个节点的左子树和右子树高度差至多等于1
    在这里插入图片描述
    由于第二条规则,在每次插入,删除时,几乎都会破坏这个规则。在调整树的过程,大大影响性能。引入红黑树。

🔥 红黑树

🔎红黑树定义:全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。

红黑树的特性:
(1)每个节点或者是黑色,或者是红色。
(2)根节点是黑色。
(3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
(4)如果一个节点是红色的,则它的子节点必须是黑色的,不能有两个红色节点相连。
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。(黑高,黑色完美平衡)
在这里插入图片描述
红黑树能自平衡:变色,左旋,右旋。

旋转和颜色变换规则:所有插入的点默认为红色

✌变色

当前结点的父亲是红色,且叔叔结点也是红色:

(1)把父节点设为黑色

(2)把叔叔也设为黑色

(3)把祖父也就是父亲的父亲设为红色(爷爷)

(4)把指针定义到祖父结点设为当前要操作的(爷爷)分析的点变换的规则

🎄左旋

当前父结点是红色,叔叔是黑色的时候,且当前的结点是右子树。左旋以父节点作为左旋

在这里插入图片描述

🎄右旋

当前父结点是红色,叔叔是黑色的时候,且当前的结点是左子树。右旋

(1)把父节点变为黑色

(2)把祖父结点变为红色(爷爷)

(3)把祖父结点旋转(爷爷)

在这里插入图片描述

所以,我们发现左旋和右旋是一个相对的操作。
关于红黑树旋转的代码,其实很简单,我大概说一下如何实现,其实每个节点有这么几个属性:
1、父节点的指向
2、子节点的指向(有两个,一个左子节点,一个右子节点)
3、该节点的颜色
4、该节点存储的value(当然如果是map,那就是该节点的key和value都要存,然后按照key的大小来插入新节点)
所以当我们做旋转的时候,只需要把该节点的父节点指向该节点的子节点,然后把子节点的一条腿接到该节点上。
————————————————
版权声明:本文为CSDN博主「lsr40」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lsr40/article/details/85245027

🔎参考博客

红黑树插入数据(变色,左旋、右旋)
数据结构:树(Tree)【详解】


http://chatgpt.dhexx.cn/article/sBwmJMaq.shtml

相关文章

红黑树的详细实现(C++)

红黑树概念(concept) 树型结构主要用于搜索&#xff0c;一直是科学领域的重要演算法&#xff0c;当中探讨了树可能遇到的问题&#xff1a;树的成长可能偏向于一边&#xff0c;也就是不平衡现象。 二叉树是常见且广泛使用的一种树&#xff0c;面临其可能退化成链表的潜藏缺点&…

二叉树——二叉查找树和红黑树

二叉树 二叉树&#xff0c;是一个非常重要的数据结构&#xff0c;在日常的开发中起着很重要的作用&#xff0c;它也衍生出来的各种高效的复杂的数据结构&#xff0c;为我们解决问题提供了高效的解决方案。 二叉树&#xff0c;它是由各个数据节点和左右链接构成的一种类似树的数…

Java——红黑树

概念 红黑树也是一种二叉搜索树&#xff0c;但是和avl树不同&#xff0c;它并不是依靠平衡因子来保证树的平衡的&#xff0c;而是通过颜色 红黑树每个节点中会存储颜色&#xff0c;分为红色和黑色&#xff0c;通过红黑树的限制条件&#xff0c;可以保证从根节点出发到叶子节点…

二叉树--红黑树

红黑树 定义 红黑树&#xff0c;顾名思义&#xff0c;就是树的节点只有红色和黑色两种状态&#xff0c;通过这两种状态的标识和规定颜色的使用&#xff0c;来使树达到相对平衡。为什么说相对平衡&#xff1f;因为在红黑树中&#xff0c;所有的条件限制只能保证&#xff0c;所…

二叉树之红黑树

红黑树 概述 为什么要有红黑树&#xff1f;&#xff1f;&#xff1f; 特点 红黑规则 如何在红黑树上添加节点&#xff1f; &#xff08;1&#xff09;我们不妨假设加入的节点都是黑色 &#xff08;2&#xff09;如果我们加入的节点都是红色 红黑树添加节点后如何保持红…

红黑二叉树

红黑树 红黑树是每个节点都带有颜色属性的二叉查找树&#xff0c;颜色或红色或黑色。在二叉查找树强制一般要求以外&#xff0c;对于任何有效的红黑树我们增加了如下的额外要求: 节点是红色或黑色。 根节点是黑色。 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有…

红黑树-Java实现

目录 一、定义 二、插入 三、删除 四、全部代码 五、颜色效果 一、定义 红黑树是特殊的平衡二叉树&#xff0c;具有以下特性&#xff1a; 1、根节点的颜色是黑色 2、节点颜色要么是黑色、要么是红色 3、如果一个节点的颜色是红色&#xff0c;则它的子节点必须是黑色&…

红黑二叉树原理分析

1.引言 HashMap的基本结构是数组&#xff0c;链表和红黑树。以数组为基本形态&#xff0c;数组中的元素先以链表形式储存&#xff0c;当链表的长 度超过8时&#xff08;包含数组上的那个链表头&#xff09;就会将链表转换为红黑树&#xff0c;以加快修改和查询效率。当然除了H…

理解红黑树及代码实现

1.红黑树定义 红黑树是一颗 红-黑的平衡二叉树,它具有二叉树的所有特性,是一颗自平衡的排序二叉树.(树中任何节点值都大于左子节点的值&#xff0c;而且都小于右子节点的值),其检索效率高&#xff0c;它是一颗空树或它的左右两个子树高度差的绝对值不超过1&#xff0c;并且左右…

红黑二叉树的漫画讲解(轻松理解红黑二叉树原理)

———————————— 二叉查找树&#xff08;BST&#xff09;具备什么特性呢&#xff1f; 1.左子树上所有结点的值均小于或等于它的根结点的值。 2.右子树上所有结点的值均大于或等于它的根结点的值。 3.左、右子树也分别为二叉排序树。 下图中这棵树&#xff0c;就是…

Java的二叉树、红黑树、B+树

数组和链表是常用的数据结构&#xff0c;数组虽然查找快&#xff08;有序数组可以通过二分法查找&#xff09;&#xff0c;但是插入和删除是比较慢的&#xff1b;而链表&#xff0c;插入和删除很快&#xff08;只需要改变一些引用值&#xff09;&#xff0c;但是查找就很慢&…

二叉树与红黑树

二叉树的形成 二叉树是n(n>0)个结点的有限集合&#xff0c;该集合或者为空集&#xff08;称为空二叉树&#xff09;&#xff0c;或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树组成 二叉树特点 由二叉树定义以及图示分析得出二叉树有以下特点&#xff1…

红黑树(C++实现)

文章目录 红黑树的概念红黑树的性质红黑树结点的定义红黑树的插入红黑树的验证红黑树的查找红黑树的删除红黑树与AVL树的比较 红黑树的概念 红黑树是一种二叉搜索树&#xff0c;但在每个结点上增加了一个存储位用于表示结点的颜色&#xff0c;这个颜色可以是红色的&#xff0c;…

红黑二叉树详解及理论分析

发表于我的博客网站(prajna.top)&#xff1a; http://prajna.top/doc/2/175 什么是红-黑二叉树&#xff1f; 红-黑二叉树首先是一颗二叉树&#xff0c;它具有二叉树的所有性质&#xff0c;是一种平衡二叉树。普通二叉树在生成过程中&#xff0c;容易出现不平衡的现象&#xff…

二叉树到红黑树

二叉树查找树 又叫二叉排序树。二叉查找树或者是一棵空树&#xff0c;或者是一棵具有如下性质的二叉树&#xff1a; 对于任何一个结点X若它的左子树非空&#xff0c;则左子树上所有结点的值均小于等于X的值&#xff1b;若它的右子树非空&#xff0c;则右子树上所有结点的值均大…

详解c++---红黑二叉树的原理和实现

目录标题 什么是红黑二叉树树红黑树的性质红黑树的效率分析红黑树的准备工作红黑树的insert函数节点的调整情况一情况二情况三 转换的实现打印函数find函数检查函数 什么是红黑二叉树树 avl树是通过控制平衡因子来控制二叉搜索树的平衡&#xff0c;当某个节点的平衡因子等于2或…

红黑树和二叉树有什么区别?

红黑树和二叉树有什么区别&#xff1f; 什么是二叉树&#xff1f;什么是红黑树&#xff1f; 二叉树&#xff08;Binary Tree&#xff09;是指每个节点最多只有两个分支的树结构&#xff0c;即不存在分支大于 2 的节点&#xff0c;二叉树的数据结构如下图所示 这是一棵拥有 6 …

二叉树系列:红黑树

介绍 红黑树(Red-Black Tree&#xff0c;简称R-B Tree)&#xff0c;它一种特殊的二叉查找树。红黑树是特殊的二叉查找树&#xff0c;意味着它满足二叉查找树的特征&#xff1a;任意一个节点所包含的键值&#xff0c;大于等于左孩子的键值&#xff0c;小于等于右孩子的键值。除了…

红黑树结构原理的图文讲解(非代码)

1.引言 HashMap的基本结构是数组&#xff0c;链表和红黑树。以数组为基本形态&#xff0c;数组中的元素先以链表形式储存&#xff0c;当链表的长度超过8时&#xff08;包含数组上的那个链表头&#xff09;就会将链表转换为红黑树&#xff0c;以加快修改和查询效率。当然除了Ha…

二叉树与红黑树见解

目录 一、红黑树简介二、 红黑树的特性三、红黑数的应用四、红黑树的原理实现4.1 识别红黑树4.2 红黑树节点的旋转4.3 插入节点4.3.1分情况讨论&#xff1a;4.3.2 代码示例 4.4删除节点相关引用 一、红黑树简介 红黑树是一种自平衡的二叉查找树&#xff0c;是一种高效的查找树…