二叉树(包含红黑树)简单概念

本文详细介绍了二叉树及其各种类型,包括满二叉树、完全二叉树、平衡二叉树(ALV树)、B树、B+树及红黑树的概念、特性与操作方法。并探讨了二叉树的一般性质与完全二叉树的性质。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考博客:传送门

目录

二叉树

满二叉树

完全二叉树

平衡二叉树(ALV树)

B树

B+树

红黑树(自平衡二叉树)

1. 左旋

2. 右旋 

添加

删除

二叉树性质

一般二叉树性质

完全二叉树性质


二叉树

是树的特殊一种,具有如下特点:

1、每个结点最多有两颗子树,结点的度最大为2

2、左子树和右子树是有顺序的,次序不能颠倒。

3、即使某结点只有一个子树,也要区分左右子树

满二叉树

所有的分支结点都存在左子树和右子树,并且所有的叶子结点都在同一层上,这样就是满二叉树。就是完美圆满的意思,关键在于树的平衡。

根据满二叉树的定义,得到其特点为:

  1. 叶子只能出现在最下一层。
  2. 非叶子结点度一定是2.
  3. 在同样深度的二叉树中,满二叉树的结点个数最多,叶子树最多。

完全二叉树

对一棵具有n个结点的二叉树按层序排号,如果编号为i的结点与同样深度的满二叉树编号为i结点在二叉树中位置完全相同,就是完全二叉树。满二叉树必须是完全二叉树,反过来不一定成立。

结合完全二叉树定义得到其特点:

  1. 叶子结点只能出现在最下一层(满二叉树继承而来)
  2. 最下层叶子结点一定集中在左 部连续位置。
  3. 倒数第二层,如有叶子节点,一定出现在右部连续位置。
  4. 同样结点树的二叉树,完全二叉树的深度最小(满二叉树也是对的)。

平衡二叉树(ALV树)

其左右子树的高度只差的绝对值不超过1,且其子树也都是平衡二叉树

B树

B树中所有结点的孩子结点最大值称为B树的阶,通常用m表示。

 特征

根节点至少有两个孩子
每个中间节点都包含k-1个元素和k个孩子,其中ceil(m/2) <= k <= m
所有叶子节点位于同一层
每个节点的元素升序排列

B树主要用于文件系统以及部分数据库索引,例如: MongoDB

而大部分关系数据库则使用B+树做索引,例如:mysql数据库

B+树

一个m阶的B+树具有如下几个特征:

节点的子树个数和元素数相等,且每个元素只用来索引,所有的数据都保存在叶子节点
叶子节点的数据顺序排列
所有中间节点元素都存在于子节点中,在其元素是最大或最小

B+树通常有两个指针,一个指向根结点,另一个指向关键字最小的叶子结点。

因此,对于B+树进行查找两种运算:
一种是从最小关键字起顺序查找
另一种是从根结点开始,进行随机查找。
 

B+树相比B树的优势:

1. 单一节点存储更多的元素,使得查询的IO次数更少;
2. 所有查询都要查找到叶子节点,查询性能稳定;
3. 所有叶子节点形成有序链表,便于范围查询。

红黑树(自平衡二叉树)

特点:
中序遍历单调不减
根节点是黑色
每个叶子节点(即不存在的空节点)为黑色
每个红色节点的子节点都是黑色,也就是说叶子节点到根节点不能有两个连续的红色节点
每个叶子节点到根节点的黑色节点个数一样

红黑树的时间复杂度为: O(lgn)

1. 左旋

2. 右旋 

添加

首先,将红黑树当作一颗二叉查找树,将节点插入;

然后,将节点着色为红色;

最后,通过旋转和重新着色等方法来修正该树,使之重新成为一颗红黑树。 

删除

首先,将红黑树当作一颗二叉查找树,将该节点从二叉查找树中删除;

然后,通过"旋转和重新着色"等一系列来修正该树,使之重新成为一棵红黑树。

二叉树性质

一般二叉树性质

1、在非空二叉树的i层上,至多有2^(i-1)个节点(i>=1)。

2、在深度为K的二叉树上最多有2^(k-1)个结点(k>=1)。

3、对于任何一棵非空的二叉树,如果叶节点个数为n0,度数为2的节点个数为n2,则有: n0 = n2 + 1

在一棵二叉树中,除了叶子结点(度为0)之外,就剩下度为 2(n2) 和 1(n1) 的结点了。则树的结点总数为T = n0 + n1 + n2;在二叉树中结点总数为T,而连线数为T-1。所以有:n0 + n1 + n2 - 1 = 2 * n2 + n1;最后得到 n0 = n2 + 1。

完全二叉树性质

具有n个结点的完全二叉树的深度为log2(n) + 1.


如有错误或不合理的地方,敬请指正~

加油!!

### 平衡二叉树红黑树概念及特点 #### 一、平衡二叉树 (AVL Tree) 平衡二叉树是一种特殊的二叉查找,其核心特性在于保持的平衡状态。具体来说,对于每一个节点,它的左右子高度差的绝对值不会超过1[^2]。这种严格的平衡约束使得平衡二叉树能够在任何情况下都维持较低的高度,从而保证了操作的时间复杂度为 \(O(\log n)\),其中 \(n\)中的节点数量。 当一棵平衡二叉树失去平衡时,通常会通过旋转操作来恢复平衡。常见的旋转方式有四种:单向右旋、单向左旋、双向先左后右旋以及双向先右后左旋[^3]。 #### 二、红黑树 (Red-Black Tree) 红黑树也是一种自平衡二叉查找,但它对平衡的要求相对宽松一些。相比于平衡二叉树严格控制左右子高度差不超过1的规定,红黑树允许更高的不平衡程度,只需满足特定的颜色规则即可: 1. 每个节点要么是红色,要么是黑色。 2. 根节点始终是黑色。 3. 所有的叶子节点(NIL节点)也必须是黑色。 4. 如果一个节点是红色,则它的两个子节点必须是黑色。(即不存在连续的红色节点) 5. 对于任意节点而言,从该节点到其后代叶节点的所有路径上包含相同数目的黑色节点[^1]。 由于这些规则的存在,即使在极端情况下,红黑树的最大深度也不会超过 \(2 \times \log_2(n+1)\)[^1]。因此,在大多数实际应用中,红黑树能够提供接近最优性能的同时还简化了许多复杂的调整逻辑——比如仅需重新着色而非频繁执行代价较高的旋转动作就可以完成部分再平衡工作。 #### 三、两者的主要区别 | **对比维度** | **平衡二叉树(AVL)** | **红黑树(RB)** | |---------------------|---------------------------------------------|--------------------------------------------| | 高度差异限制 | 左右子高度差不得超过1 | 不强制要求固定高度差, 只要遵循五条性质 | | 插入/删除效率 | 更倾向于维护完全平衡, 导致更多旋转 | 较少依赖旋转, 多利用重染色实现局部修正 | | 实现难度 | 结构简单但因频繁旋转增加编码负担 | 虽然概念稍显抽象却减少了不必要的结构调整 | 综上所述,尽管两种数据结构都能有效解决动态集合上的高效查询需求,但在不同场景下各有优劣取舍之处[^2]. ```python class Node: def __init__(self, key, color='red', parent=None, left=None, right=None): self.key = key self.color = color self.parent = parent self.left = left self.right = right def insert_case1(node): """处理新插入节点作为根的情况""" if node.parent is None: node.color = 'black' ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值