算法与数据结构 - 二叉树结构入门
目录
1. 普通二叉树结构
1.1. 常见术语
1.2. 完全二叉树 (Complete Binary Tree)
1.3. 满二叉树 (Full Binary Tree)
2. 特殊二叉树结构
2.1. 二叉搜索树 (BST)
2.1.1. BST 基本操作 - 查找
2.1.2. BST 基本操作 - 插入
2.1.3. BST 基本操作 - 删除
2.2. 平衡二叉树 (AVL 树)
2.2.1. 基本概念
2.2.2. 核心特性
2.2.3. 平衡操作(旋转)
2.3. 红黑树
2.3.1. 基本概念
2.3.2. 核心特性
2.3.3. 平衡操作
3. 总结
1. 普通二叉树结构
二叉树是计算机科学中最基础且重要的树形数据结构之一,非空时由根节点和两个不相交的子树(左子树和右子树)组成。树中每个节点(包括根节点)最多有两个子节点(称为左子节点和右子节点),普通二叉树无其他约束。
1.1. 常见术语
-
根节点(Root):最顶层的节点
-
叶子节点(Leaf):没有子节点的节点
-
内部节点:至少有一个子节点的节点
-
深度(Depth):从根节点到某一节点的边数
-
高度(Height):从根节点到最深叶子节点的边数
-
度(Degree):节点的子节点数(二叉树中最大为2)
1.2. 完全二叉树 (Complete Binary Tree)
定义:
完全二叉树是指除了最后一层外,其他各层节点数都达到最大值,并且最后一层的节点都连续集中在左侧的二叉树。
特点:
-
可以不完全填满,但空缺只能出现在最后一层的最右侧
-
高度为 h 的完全二叉树,节点数n满足:
2^(h-1) ≤ n < 2^h - 1
-
常用于堆的实现
-
可以用数组高效存储(按层序遍历顺序存储)
示例:
A/ \B C/ \ /D E F
1.3. 满二叉树 (Full Binary Tree)
定义:
满二叉树是指所有非叶子节点都有两个子节点,且所有叶子节点都在同一层的二叉树。
特点:
-
每一层的节点数都达到最大值
-
高度为h的满二叉树,节点总数为
2^h - 1
-
叶子节点数 = 非叶子节点数 + 1
-
严格平衡,是最"饱满"的二叉树形态
示例:
A/ \B C/ \ / \D E F G
我可以看到,满二叉树其实是完全二叉树的特例。
2. 特殊二叉树结构
2.1. 二叉搜索树 (BST)
定义:
对于树中的每个节点:
-
左子树所有节点的值 小于 该节点的值
-
右子树所有节点的值 大于 该节点的值
-
左右子树也分别是BST
-
没有键值相等的节点(通常定义)
特点:
-
中序遍历BST会得到一个升序排列的元素序列
-
查找效率取决于树的高度
-
平均时间复杂度:O(log n)
-
最坏情况(退化成链表):O(n)
示例:
2.1.1. BST 基本操作 - 查找
def search(root, val):if not root or root.val == val:return rootif val < root.val:return search(root.left, val)return search(root.right, val)
2.1.2. BST 基本操作 - 插入
def insert(root, val):if not root:return TreeNode(val)if val < root.val:root.left = insert(root.left, val)elif val > root.val:root.right = insert(root.right, val)return root
2.1.3. BST 基本操作 - 删除
三种情况处理:
-
无子节点:直接删除
-
一个子节点:用子节点替代
-
两个子节点:用后继节点(右子树的最小值)或前驱节点(左子树的最大值)替代
def deleteNode(root, key):if not root:return Noneif key < root.val:root.left = deleteNode(root.left, key)elif key > root.val:root.right = deleteNode(root.right, key)else:if not root.left:return root.rightif not root.right:return root.left# 找右子树的最小节点temp = root.rightwhile temp.left:temp = temp.leftroot.val = temp.valroot.right = deleteNode(root.right, temp.val)return root
2.2. 平衡二叉树 (AVL 树)
AVL树是最早发明的自平衡二叉搜索树,由G.M. Adelson-Velsky和E.M. Landis在1962年提出。
2.2.1. 基本概念
AVL树是一种严格平衡的二叉搜索树,它要求:
-
每个节点的左右子树高度差(平衡因子)的绝对值不超过1
-
如果插入或删除操作导致平衡因子绝对值大于1,则通过旋转操作重新平衡
2.2.2. 核心特性
-
平衡因子(Balance Factor):
-
对于任意节点,平衡因子 = 左子树高度 - 右子树高度
-
合法值:-1、0、1
-
-
高度平衡:
-
保证树的高度始终为O(log n)
-
查找、插入、删除操作的时间复杂度均为O(log n)
-
2.2.3. 平衡操作(旋转)
当插入或删除导致不平衡时,有四种旋转情况:
1. 左旋 (RR情况 - 右子树的右子树导致不平衡)
A (平衡因子=-2)\B (平衡因子=-1)\C
旋转后:
B/ \A C
2. 右旋 (LL情况 - 左子树的左子树导致不平衡)
A (平衡因子=+2)/B (平衡因子=+1)/C
旋转后:
B/ \C A
3. 左右旋 (LR情况)
A/B\C
先对B左旋,再对A右旋:
C/ \B A
4. 右左旋 (RL情况)
A\B/C
先对B右旋,再对A左旋:
C/ \A B
2.3. 红黑树
红黑树是一种广泛使用的自平衡二叉搜索树,它在1972年由Rudolf Bayer发明,被称为"对称二叉B树",后来由Leo J. Guibas和Robert Sedgewick在1978年完善并命名为红黑树。
2.3.1. 基本概念
红黑树通过以下规则保持平衡:
-
节点颜色:每个节点是红色或黑色
-
根节点:根节点必须是黑色
-
叶子节点:所有叶子节点(NIL节点,空节点)都是黑色
-
红色节点规则:红色节点的两个子节点都必须是黑色(即不能有连续的红色节点)
-
黑高一致:从任一节点到其每个叶子节点的所有路径都包含相同数目的黑色节点(称为"黑高")
2.3.2. 核心特性
-
近似平衡:虽然不如AVL树严格平衡,但能保证最长路径不超过最短路径的两倍
-
高效操作:插入、删除和查找操作的时间复杂度都是O(log n)
-
旋转次数少:相比AVL树,红黑树在插入和删除时需要的旋转操作更少
2.3.3. 平衡操作
1. 插入操作
-
按照二叉搜索树规则插入新节点(初始设为红色)
-
检查并修复红黑树性质:
-
情况1:新节点是根节点 → 变为黑色
-
情况2:父节点是黑色 → 无需处理
-
情况3:父节点和叔节点都是红色 → 重新着色
-
情况4:父节点红而叔节点黑(或不存在)→ 旋转+重新着色
-
2. 删除操作
-
执行标准BST删除
-
如果删除的是红色节点,性质保持不变
-
如果删除的是黑色节点,需要通过旋转和重新着色来修复性质
旋转操作
红黑树使用两种基本旋转(与AVL树类似):
-
左旋:
P Q/ \ / \A Q → P C/ \ / \B C A B
-
右旋:
P Q/ \ / \Q C → A P/ \ / \ A B B C
3. 总结
我们可以看到 AVL 树和红黑树其实是二叉搜索树的变种。AVL 和 红黑树的代码相对比较复杂,涉及复杂的旋转问题。具体的代码,将在之后的博文里讨论。
相关文章:

算法与数据结构 - 二叉树结构入门
目录 1. 普通二叉树结构 1.1. 常见术语 1.2. 完全二叉树 (Complete Binary Tree) 1.3. 满二叉树 (Full Binary Tree) 2. 特殊二叉树结构 2.1. 二叉搜索树 (BST) 2.1.1. BST 基本操作 - 查找 2.1.2. BST 基本操作 - 插入 2.1.3. BST 基本操作 - 删除 2.2. 平衡二叉树…...

如何使用远程桌面控制电脑
目的: 通过路由器使用pc控制台式机,实现了有线/无线pc与台式机的双向远程桌面控制 最核心就两条:get ip地址与被控制机器的账户与密码。 现象挺神奇:被控制电脑的电脑桌面处于休眠模式,此时强行唤醒被控电脑会导致中断…...

SpringMVC-执行流程
目录 前言 一、SpringMVC执行流程 SpringMVC 主要组件 SpringMVC 的执行流程 简要分析执行流程 总结 前言 理解SpringMVC的执行流程是学习SpringMVC工作原理的重要一步。 项目内容参考:SpringMVC-简介及入门-CSDN博客 一、SpringMVC执行流程 SpringMVC 主要组…...

计算机网络网络层(下)
一、互联的路由选择协议(网络层控制层面内容) (一)有关路由选择协议的几个概念 1.理想的路由算法 (1)理想路由算法应具备的特点:算法必须正确和完整的,算法在计算上应简单&#x…...

深入学习Zookeeper的知识体系
目录 1、介绍 1.1、CAP 理论 1.2、BASE 理论 1.3、一致性协议ZAB 1、介绍 2、角色 3、ZXID和myid 4、 历史队列 5、协议模式 6、崩溃恢复模式 7、脑裂问题 2、zookeeper 2.1、开源项目 2.2、功能 2.3、选举机制 3、数据模型 3.1、介绍 3.2、znode分类 4、监听…...
主从架构:技术原理与实现
一.简单介绍分布式锁的复习 今天在一个分布式锁的视频讲解中,提到了主从架构,所以有了这篇文章。 当然我们可以先说说分布式锁,可以使用redis的setnxlua脚本实现,或者也可以用redission实现,或者看门狗机制。 由看门…...
大模型核心运行机制
大模型核心运行机制目录 一、核心架构:Transformer的演进与改进1.1 核心组件包括:1.1.1 自注意力机制(Self-Attention)1.1.2 多头注意力(Multi-Head Attention)1.1.3 位置编码(Positional Encod…...

uniapp跨平台开发HarmonyOS NEXT应用初体验
之前写过使用uniapp开发鸿蒙应用的教程,简单介绍了如何配置开发环境和运行项目。那时候的HbuilderX还是4.22版本,小一年过去了HbuilderX的正式版本已经来到4.64,历经了多个版本的更新后,跨平台开发鸿蒙应用的体验大幅提升。今天再…...

2025软考【系统架构设计师】:两周极限冲刺攻略(附知识点解析+答题技巧)
距离2025上半年“系统架构设计师”考试已经只剩最后两周了,还没有准备好的小伙伴赶紧行动起来。为了帮助大家更好的冲刺学习,特此提供一份考前冲刺攻略。本指南包括考情分析、答题技巧、注意事项三个部分,可以参考此指南进行最后的复习要领&a…...
C语言主要标准版本的演进与核心区别的对比分析
以下是C语言主要标准版本的演进与核心区别的对比分析 K&R C(1978年) 定位:非标准化的原始版本,由Brian Kernighan和Dennis Ritchie定义 特性: 基础语法:函数声明无参数列表(如int func…...

使用 goaccess 分析 nginx 访问日志
介绍 goaccess 是一个在本地解析日志的工具, 可以直接在命令行终端环境中使用 TUI 界面查看分析结果, 也可以导出为更加丰富的 HTML 页面. 官网: https://goaccess.io/ 下载安装 常见的 Linux 包管理器中都包含了 goaccess, 直接安装就行. 以 Ubuntu 为例: sudo apt instal…...

vue3与springboot交互-前后分离【完成登陆验证及页面跳转】
vue3实现与springboot交互【完成登陆及页面跳转】 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是node.js和vue的使用。前后每一小节的内容是存在的有:学习and理解的关联性。【帮帮志系列文章】:…...

【Hot 100】208. 实现 Trie (前缀树)
目录 引言实现 Trie (前缀树)我的解题代码解析代码思路分析优化建议1. 内存泄漏问题2. 使用智能指针优化内存管理3. 输入合法性校验(可选)4. 其他优化 总结 🙋♂️ 作者:海码007📜 专栏:算法专栏…...

【2025最新】Vm虚拟机中直接使用Ubuntu 免安装过程直接使用教程与下载
Ubuntu 是一个基于 Debian 的自由开源 Linux 操作系统,面向桌面、服务器和云计算平台广泛应用。 由英国公司 Canonical Ltd. 维护和发布,Ubuntu 强调易用性、安全性和稳定性,适合个人用户、开发者以及企业部署使用。 Ubuntu 默认使用 GNOME …...
思路解析:第一性原理解 SQL
目录 题目描述 🎯 应用第一性原理来思考这个 SQL 题目 ✅ 第一步:还原每个事件的本质单位 ✅ 第二步:如果一个表只有事件,如何构造事件对? ✅ 第三步:加过滤条件,只保留“同一机器、同一进…...
相机Camera日志分析之八:高通Camx HAL架构opencamera三级日志详解及关键字
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:相机Camera日志分析之七:高通Camx HAL架构opencamera二级日志详解及关键字 这一篇我们开始讲: 相机Camera日志分析之八:高通Camx HAL架构opencamera三级日志详解及关键字 目录 【关注我,后续持续…...

Vue2 elementUI 二次封装命令式表单弹框组件
需求:封装一个表单弹框组件,弹框和表单是两个组件,表单组件以插槽的形式动态传入弹框组件中。 外部组件使用的方式如下: 直接上代码: MyDialog.vue 弹框组件 <template><el-dialog:titletitle:visible.syn…...
Docker入门教程:常用命令与基础概念
目录 简介常用命令Docker 常用命令汇总docker run 命令格式与参数解析 简介 Docker 是一个客户端-服务器(client-server)架构的应用程序,其中包含两个主要组件:Docker 客户端和 Docker 守护进程(也称为 Docker Daemon…...

Antd中Form详解:
1.获取Form表单值的方式: ① 使用Form.useForm()钩子(推荐方式) const [form] Form.useForm();const getFormValues () > {const values form.getFieldsValue();};<Form form{form}>...<Form.Item label{null}><Button onClick{ge…...
探索C语言中的二叉树:原理、实现与应用
一、引言 二叉树作为一种重要的数据结构,在计算机科学领域有着广泛的应用,无论是在操作系统的文件系统管理,还是在数据库的索引构建中,都能看到它的身影。在C语言中,我们可以利用指针灵活地构建和操作二叉树。接下来&…...

docker系列-DockerDesktop报错信息(Windows Hypervisor is not present)
Docker Desktop 报错信息 Docker Desktop - Windows Hypervisor is not present Docker Desktop is unable to detect a Hypervisor. Hardware assisted virtualization and data execution protection must be enabled in the BIOS.这是因为 Docker Desktop 需要启用 虚拟化技…...
03.Python 字符串中的空白字符处理
Python 字符串中的空白字符处理 什么是空白字符? 在处理字符串时,常常需要去除多余的空白字符。空白字符包括: 空格( )制表符(\t)换行符(\n)回车符(\r&#x…...

《基于 Kubernetes 的 WordPress 高可用部署实践:从 MariaDB 到 Nginx 反向代理》
手把手教你用 Kubernetes 部署高可用 WordPress 博客 本实验通过 Kubernetes 容器编排平台,完整部署了一个高可用的 WordPress 网站架构,包含 MariaDB 数据库、WordPress 应用和 Nginx 反向代理三大核心组件。实验涵盖了从基础环境准备到最终服务暴露的…...

Ubuntu源码版comfyui的安装
Comfyui也出桌面版了,但是想让大家多个人都使用怎么办呢?也有方法,安装Linux版,启动后会生成个网页地址,打开就能用了。 1、先来看下本地安装环境配置: 系统:Ubuntu 22.04 内存:2…...
多模态RAG与LlamaIndex——1.deepresearch调研
摘要 关键点: 多模态RAG技术通过结合文本、图像、表格和视频等多种数据类型,扩展了传统RAG(检索增强生成)的功能。LlamaIndex是一个开源框架,支持多模态RAG,提供处理文本和图像的模型、嵌入和索引功能。研…...
C++ 命令模式详解
命令模式(Command Pattern)是一种行为设计模式,它将请求封装为对象,从而使你可以参数化客户端使用不同的请求、队列或日志请求,以及支持可撤销的操作。 核心概念 设计原则 命令模式遵循以下设计原则: 单…...

制作一款打飞机游戏47:跳转
编辑器的问题 我们开始为不同的敌人编写一些行为,到目前为止进展顺利,一切都很棒。但上次我们遇到了一些问题,我们发现在这个编辑器中编写代码有时有点困难,因为当你想要在某行之间插入内容时,你不得不删除一切然后重…...

本地部署ollama及deepseek(linux版)
一、安装ollama export OLLAMA_MIRROR"https://ghproxy.cn/https://github.com/ollama/ollama/releases/latest/download"curl -fsSL https://ollama.com/install.sh | sed "s|https://ollama.com/download|$OLLAMA_MIRROR|g" | shexport OLLAMA_MIRROR&q…...
Java Spring Boot项目目录规范示例
以下是一个典型的 Java Spring Boot 项目目录结构规范示例,结合了分层架构和模块化设计的最佳实践: text 复制 下载 src/ ├── main/ │ ├── java/ │ │ └── com/ │ │ └── example/ │ │ └── myapp/ │…...
针对共享内存和上述windows消息机制 在C++ 和qt之间的案例 进行详细举例说明
针对共享内存和上述windows消息机制 在C++ 和qt之间的案例 进行详细举例说明 以下是关于在 C++ 和 Qt 中使用共享内存(QSharedMemory)和 Windows 消息机制(SendMessage / PostMessage)进行跨线程或跨进程通信的详细示例。 🧩 使用 QSharedMemory 进行进程间通信(Qt 示例…...