二叉树与红黑树核心知识点及面试重点
二叉树与红黑树核心知识点及面试重点
一、二叉树 (Binary Tree)
1. 基础概念
-
定义:每个节点最多有两个子节点(左子节点和右子节点)
-
术语:
-
根节点:最顶层的节点
-
叶子节点:没有子节点的节点
-
深度:从根到节点的路径长度
-
高度:从节点到最深叶子节点的路径长度
-
2. 常见类型
类型 | 特点 |
---|---|
满二叉树 | 所有非叶子节点都有两个子节点,且所有叶子在同一层 |
完全二叉树 | 除最后一层外,其他层必须填满,最后一层从左到右连续填充 |
二叉搜索树(BST) | 左子树所有节点值 < 根节点值 < 右子树所有节点值(中序遍历有序) |
平衡二叉树 | 任意节点的左右子树高度差不超过1(如AVL树) |
3. 遍历方式(重点!)
-
前序遍历:根 → 左 → 右
java
void preOrder(TreeNode root) {if (root == null) return;System.out.print(root.val + " ");preOrder(root.left);preOrder(root.right); }
中序遍历:左 → 根 → 右(BST中序遍历结果为升序)
-
后序遍历:左 → 右 → 根
-
层序遍历:按层级从上到下、从左到右(BFS实现)
4. 面试高频问题
-
二叉树的最大深度
java
int maxDepth(TreeNode root) {return root == null ? 0 : 1 + Math.max(maxDepth(root.left), maxDepth(root.right)); }
判断是否为平衡二叉树
(需同时检查高度差和左右子树是否平衡) -
二叉树的最近公共祖先(LCA)
(分治思想,递归查找左右子树)
二、红黑树 (Red-Black Tree)
1. 核心性质
红黑树是自平衡的二叉搜索树,满足以下规则:
-
节点颜色:每个节点非红即黑
-
根节点:必须为黑色
-
叶子节点(NIL):虚拟的黑色空节点
-
红色节点规则:红色节点的子节点必须为黑色(不能有连续红节点)
-
黑高平衡:从任一节点到其叶子节点的所有路径包含相同数量的黑色节点
2. 平衡操作(关键面试点)
-
左旋/右旋:调整树结构保持平衡
java
// 伪代码示例:左旋 void leftRotate(Node x) {Node y = x.right;x.right = y.left;if (y.left != nil) y.left.parent = x;y.parent = x.parent;// ... 更新父节点指向 }
颜色翻转:插入/删除后通过变色和旋转恢复平衡
3. 与AVL树的对比
特性 | 红黑树 | AVL树 |
---|---|---|
平衡标准 | 黑高平衡(宽松) | 严格高度平衡(左右子树高度差≤1) |
插入/删除 | 最多2次旋转 | 可能需O(log n)次旋转 |
查询效率 | O(log n),但常数项比AVL大 | 更快的查询(严格平衡) |
应用场景 | Java HashMap, TreeMap | 数据库索引等高频查询场景 |
4. 时间复杂度
操作 | 时间复杂度 | 原因 |
---|---|---|
插入 | O(log n) | 自平衡调整 |
删除 | O(log n) | 最多3次旋转 |
查找 | O(log n) | 近似平衡的二叉搜索树 |
5. 面试高频问题
-
红黑树如何保证平衡?
(结合插入/删除的变色和旋转规则回答) -
为什么Java的HashMap链表长度超过8转红黑树?
(哈希冲突时,红黑树将查找时间从O(n)优化到O(log n)) -
手写红黑树的插入逻辑
(需掌握case分析,如叔节点为红/黑时的不同处理)
三、实战代码片段
红黑树节点定义
java
class RBNode<K extends Comparable<K>, V> {K key;V value;RBNode<K,V> left, right, parent;boolean color; // RED or BLACK
}
检查红黑树有效性
java
boolean isRBTreeValid(RBNode root) {if (root == null) return true;// 规则2:根节点必须为黑if (root.color != BLACK) return false;// 检查每条路径的黑高相同int blackHeight = getBlackHeight(root);return checkRedBlackRules(root, blackHeight, 0);
}
四、常见面试题
-
二叉树
-
如何序列化/反序列化二叉树?
-
如何实现二叉树的层次遍历?
-
判断两棵二叉树是否相同?
-
-
红黑树
-
为什么红黑树的效率比AVL树更适合Java集合类?
-
红黑树的插入删除过程中,有哪些情况需要处理?
-
如何证明红黑树的高度是O(log n)?
-
掌握这些核心知识点后,你就能在面试中游刃有余地应对树结构相关问题!红黑树的实现细节较复杂,建议结合可视化工具(如Red-Black Tree Visualizer)加深理解。
相关文章:
二叉树与红黑树核心知识点及面试重点
二叉树与红黑树核心知识点及面试重点 一、二叉树 (Binary Tree) 1. 基础概念 定义:每个节点最多有两个子节点(左子节点和右子节点) 术语: 根节点:最顶层的节点 叶子节点:没有子节点的节点 深度…...
Rocket-JWT鉴权
目录 一、概述 二、相关依赖 三、环境准备 3.1 创建项目 3.2 读取私钥信息 3.3 token数据负载 3.4 生成token 四、Web鉴权 4.1 验证载体 4.2 接收请求 五、总结 Welcome to Code Blocks blog 本篇文章主要介绍了 [Rocket-JWT鉴权] ❤博主广交技术好友,喜…...
2025 年网络安全终极指南
我们生活在一个科技已成为日常生活不可分割的一部分的时代。对数字世界的依赖性日益增强的也带来了更大的网络风险。 网络安全并不是IT专家的专属特权,而是所有用户的共同责任。通过简单的行动,我们可以保护我们的数据、隐私和财务,降低成为…...
横扫SQL面试——PV、UV问题
📊 横扫SQL面试:UV/PV问题 🌟 什么是UV/PV? 在数据领域,UV(Unique Visitor,独立访客) 和 PV(Page View,页面访问量) 是最基础也最重要的指标&…...
ctf-show-杂项签到题
下载文件,解压需要密码,用010打开没看出什么 然后用Advanced Archive Password Recovery暴力破解,发现没用 怀疑是伪解密,解压出来发现加密受损用随波逐流修复加密文件 打开修复的加密文件直接得flag flag:flag{79d…...
对解释器模式的理解
对解释器模式的理解 一、场景1、题目【[来源](https://kamacoder.com/problempage.php?pid1096)】1.1 题目描述1.2 输入描述1.3 输出描述1.4 输入示例1.5 输出示例 二、不采用解释器模式1、代码2、“缺点” 三、采用解释器模式1、代码2、“优点” 四、思考1、解释器模式的意义…...
高频面试题(含笔试高频算法整理)基本总结回顾64
干货分享,感谢您的阅读! (暂存篇---后续会删除,完整版和持续更新见高频面试题基本总结回顾(含笔试高频算法整理)) 备注:引用请标注出处,同时存在的问题请在相关博客留言…...
python入门之从安装python及vscode开始
本篇将解决三个问题: 1. 如何下载及安装官方python? 2. 如何下载及安装vscode? 3. 如何配置vscode的python环境? 一、python下载及安装 1.搜索python,找到官网并打开 2.找到download,按需选择版本下载 …...
OpenGL学习笔记(模型材质、光照贴图)
目录 光照与材质光照贴图漫反射贴图采样镜面光贴图 GitHub主页:https://github.com/sdpyy OpenGL学习仓库:https://github.com/sdpyy1/CppLearn/tree/main/OpenGLtree/main/OpenGL):https://github.com/sdpyy1/CppLearn/tree/main/OpenGL 光照与材质 在现实世界里&…...
视觉_transform
visual_transform 图像分块 (Patch Embedding) 假设输入图像为 x ∈ R ∗ H ∗ ∗ W ∗ ∗ C ∗ x∈R^{*H**W**C*} x∈R∗H∗∗W∗∗C∗ C 是图像的通道数(例如,RGB图像的 C3) 将图像分割成N个大小为P*CP的patch,每个patch的大…...
Redis的安装及通用命令
二. Redis 的安装及通用命令 1. Ubuntu 安装 Redis (1) 切换到 root 用户: su root(2) 搜索 Redis 软件包 apt search redis(3) 安装 Redis apt install redis(4) 查看 Redis netstat -anp | grep redis(5) 切换到 Redis 目录下 cd /etc/redis/(6) 修改 Redis 配置文件:…...
Python 实现的运筹优化系统代码详解(0-1规划背包问题)
一、引言 在数学建模与实际决策场景的交织领域中,诸多复杂问题亟待高效且精准的解决方案。0-1 规划作为一种特殊且极为重要的优化方法,宛如一把万能钥匙,能够巧妙开启众多棘手问题的解决之门。它专注于处理决策变量仅能取 0 或 1 这两种极端状…...
护网蓝初面试题
《网安面试指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇网安资料库https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39…...
音视频学习(三十二):VP8和VP9
VP8 简介 全称:Video Processing 8发布者:原 On2 Technologies(2010 被 Google 收购)定位:开源视频压缩标准,主要竞争对手是 H.264应用: WebRTC 视频通信HTML5 <video> 标签(…...
美国mlb与韩国mlb的关系·棒球9号位
MLB(Major League Baseball,美国职业棒球大联盟)作为全球最高水平的职业棒球联赛,与韩国市场流行的“MLB”时尚品牌之间存在着授权合作关系,但两者在业务范畴和品牌定位上存在显著差异。 一、品牌授权背景:…...
免费在线PUA测试工具:识别情感操控,守护情感健康
免费在线PUA测试工具:识别情感操控,守护情感健康 你是否曾经在感情中感到困惑、不安,甚至怀疑自己?今天为大家推荐一个专业的PUA测试工具,帮助你识别是否正在经历情感操控。 测试工具链接:PUA测试工具 什么…...
nginx中的try_files指令
try_files 是 Nginx 中一个非常有用的指令,用于按顺序检查文件是否存在,并返回第一个找到的文件。如果所有指定的文件都不存在,则执行回退逻辑,如重定向到一个指定的 URI 或返回一个错误代码。 作用 文件查找:按顺序检…...
[特殊字符] 驱动开发硬核特训 · Day 4
主题:从硬件总线到驱动控制 —— I2C 协议与传感器驱动开发全解析 I2C(Inter-Integrated Circuit)总线是一种广泛用于嵌入式设备的串行通信协议,因其低成本、简单布线和多从设备支持,成为连接各种传感器(温…...
Python 实现玻璃期货数据处理、入库与分析:从代码到应用
Python 实现期货数据处理与分析:从代码到应用 引言 在金融市场中,期货数据的处理和分析对于投资者和分析师来说至关重要。Python 凭借其丰富的库和简洁的语法,成为了处理和分析期货数据的强大工具。本文将详细解读一段用于处理期货持仓和行…...
神经网络之损失函数
引言:损失函数 (Loss Function)是机器学习和深度学习中非常重要的一个概念。用于衡量模型的预测值与真实值之间的差异,从而指导模型优化其参数以最小化这种差异。 一、损失函数作用 量化误差:损失函数是将预测值和真实…...
在Ubuntu内网环境中为Gogs配置HTTPS访问(通过Apache反向代理使用IP地址)
一、准备工作 确保已安装Gogs并运行在HTTP模式(默认端口3000) 确认服务器内网IP地址(如192.168.1.100) 二、安装Apache和必要模块 sudo apt update sudo apt install apache2 -y sudo a2enmod ssl proxy proxy_http rewrite headers 三、创建SSL证书 1. 创建证书存储目录…...
printf
printf() 是 C 和 C 标准库中的一个输出函数,位于 <cstdio> 头文件中。下面为你详细介绍它的相关知识点。 1. 基本使用 printf() 函数的作用是按照指定格式将数据输出到标准输出设备(通常是控制台)。其基本语法如下: cpp …...
Leetcode 311 Sparse Matrix Multiplication 稀疏矩阵相乘
Problem Given two sparse matrices A and B, return the result of AB. You may assume that A’s column number is equal to B’s row number. Example: A [[ 1, 0, 0],[-1, 0, 3] ]B [[ 7, 0, 0 ],[ 0, 0, 0 ],[ 0, 0, 1 ] ]| 1 0 0 | | 7 0 0 | | 7 0 0 | AB …...
mysql和sqlite关于data数据的识别问题
<input type"date" name"birthday" value""> # 表单传入的日期 birthday request.form.get(birthday) # 获取日期 birthday Column(birthday, Date, comment出生日期, nullableTrue) # 数据库的数据字段模型 birthday_str request…...
2024 天梯赛——工业园区建设题解
思路 将点 i i i 视为固定点, 点 j j j 视为灵活点,其中 s i 1 s_{i} 1 si1, s j 0 s_{j} 0 sj0。维护四个队列,其中 q 0 q_{0} q0 和 q 1 q_{1} q1 分别维护还没有被选用的固定点 和 灵活点, Q 0 Q…...
亚马逊AI新功能上线:5大亮点解锁精准消费预测
在人工智能技术不断重塑跨境电商生态之际,全球电商巨头亚马逊(Amazon)再次迈出关键一步。近日,亚马逊正式对其卖家中心推出一系列基于AI的新功能,聚焦于消费数据预测、用户行为洞察、库存智能管理与个性化营销服务等方…...
opus+ffmpeg+c++实现录音
说明: opusffmpegc实现录音 效果图: step1:C:\Users\wangrusheng\source\repos\WindowsProject1\WindowsProject1\WindowsProject1.cpp // WindowsProject1.cpp : 定义应用程序的入口点。 //#include "framework.h" #include "Windows…...
ComfyUI的本地私有化部署使用Stable Diffusion文生图
什么是ComfyUI ? ComfyUI是一个基于节点流程的Stable Diffusion操作界面。以下是关于它的详细介绍: 特点与优势 高度可定制:提供丰富的节点类型,涵盖文本处理、图像处理、模型推理等功能。用户可根据需求自由组合节点࿰…...
【学习笔记17】Windows环境下安装RabbitMQ
一. 下载RabbitMQ( 需要按照 Erlang/OTP 环境的版本依赖来下载) (1) 先去 RabbitMQ 官网,查看 RabbitMQ 需要的 Erlang 支持:https://www.rabbitmq.com/ 进入官网,在 Docs -> Install and Upgrade -> Erlang V…...
【LeetCode 热题100】55:跳跃游戏(详细解析)(Go语言版)
🚀 LeetCode 热题 55:跳跃游戏(Jump Game)完整解析 📌 题目描述 给定一个非负整数数组 nums,你最初位于数组的第一个下标。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一…...
OpenCV轮廓检测全面解析:从基础到高级应用
一、概述 轮廓检测是计算机视觉中的基础技术,用于识别和提取图像中物体的边界。与边缘检测不同,轮廓检测更关注将边缘像素连接成有意义的整体,形成封闭的边界。 轮廓检测的核心价值 - 物体识别:通过轮廓可以识别图像中的独立物体…...
微服务入门:Spring Boot 初学者指南
大家好,这里是架构资源栈!点击上方关注,添加“星标”,一起学习大厂前沿架构! 微服务因其灵活性、可扩展性和易于维护性而成为现代软件架构的重要组成部分。在本博客中,我们将探讨如何使用 Spring Boot 构建…...
Windows环境下开发pyspark程序
Windows环境下开发pyspark程序 一、环境准备 1.1. Anaconda/Miniconda(Python环境) 如果不怕包的版本管理混乱,可以直接使用已有的Python环境。 需要安装anaconda/miniconda(python3.8版本以上):Anaconda…...
嵌入式学习笔记——大小端及跳转到绝对地址
大小端以及跳转到绝对地址 0x100000 嵌入式编程中的大小端详解一、大端模式与小端模式二、判断当前系统是大端还是小端方法一:指针强制类型转换方法二:使用联合体(union) 三、结构体位段和大小端的影响四、大小端影响内存的 memc…...
eprime相嵌模式实验设计
一、含义与模型结构 该模式的实验设计至少 由两个存储不同实验材料及 属性的List和一个核心实验 过程CEP组成。子list1和 list2相嵌在父List中,CEP 可以调用List中的材料,也 可以调用list1和list2中的材 料。 二、相嵌模式的应用 应用于解决“多重随…...
编译uboot的Makefile编写
make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- distcleanmake ARCHarm CROSS_COMPILEarm-linux-gnueabihf- mx6ull_14x14_ddr512_emmc_defconfigmake V1 ARCHarm CROSS_COMPILEarm-linux-gnueabihf- -j12 这三条命令中 ARCHarm 设置目标为 arm 架构, CROSS_COMP…...
Go语言常用算法实现
以下是Go语言中常用的算法实现,涵盖排序、搜索、数据结构操作等核心算法。 一、排序算法 1. 快速排序 func QuickSort(arr []int) []int {if len(arr) < 1 {return arr}pivot : arr[0]var left, right []intfor i : 1; i < len(arr); i {if arr[i] < pi…...
Windows上使用NSSM注册定时服务
适用和不适用场景 适用场景 持续运行 的脚本或程序(如 Laravel 的 schedule:run 每分钟检查任务)后台常驻 的任务或服务(如监听服务、实时同步) 不适用场景 低频次任务(如每日/每周备份) NSSM 常驻内存…...
【Gorm】模型定义
intro package mainimport ("gorm.io/gorm""gorm.io/driver/sqlite" // GORM 使用该驱动来连接和操作 SQLite 数据库。 )type Product struct {gorm.Model // 嵌入GORM 内置的模型结构,包含 ID、CreatedAt、UpdatedAt、DeletedAt 四个字段Cod…...
程序化广告行业(65/89):AdX/SSP系统深度剖析与实战要点
程序化广告行业(65/89):AdX/SSP系统深度剖析与实战要点 大家好!一直以来,我都对程序化广告领域充满热情,这个领域发展迅速且不断涌现新的技术和模式。之前我们探讨了程序化广告的一些基础内容,…...
算法刷题记录——LeetCode篇(2.7) [第161~170题](持续更新)
更新时间:2025-04-06 算法题解目录汇总:算法刷题记录——题解目录汇总技术博客总目录:计算机技术系列博客——目录页 优先整理热门100及面试150,不定期持续更新,欢迎关注! 169. 多数元素 给定一个大小为…...
conda安装指定版本python环境
1. 创建指定 Python 版本的环境 使用以下命令创建环境,并将 <env_name> 替换为你的环境名称,<python_version> 替换为具体的 Python 版本(如 3.8, 3.9 等) conda create -n <env_name> python<python_vers…...
PH热榜 | 2025-04-05
1. Comp AI 标语:开源的 Vanta 和 Drata 替代方案 介绍:这款开源的 Drata 和 Vanta 替代方案,能够帮助你在几周内,轻松满足 SOC 2、ISO 27001 和 GDPR 等合规框架的要求,而不是像往常那样拖延数月。 产品网站&#…...
C++之红黑树
目录 一、红黑树的概念 1.1、红黑树的规则 1.2、红黑树如何确保最长路径不超过最短路径的二倍 1.3、红黑树的效率 二、红黑树的实现 2.1、红黑树的结构 2.2、红黑树的插入 2.2.1、红黑树插入一个值的大概过程 2.2.2、情况一:变色 2.2.3、情…...
各个语言对不同数据结构的叫法
一、基础数据结构对比 数组(Array) C/C:固定大小数组(int arr),动态数组通过vector(C)实现 Java:固定数组(int[]),动态数组…...
蓝桥杯 web 水果拼盘 (css3)
做题步骤: 看结构:html 、css 、f12 分析: f12 查看元素,你会发现水果的高度刚好和拼盘的高度一样,每一种水果的盘子刚好把页面填满了,所以咱们就只要让元素竖着排列,加上是竖着,排不下的换行…...
算法专题(八):分治-归并排序
目录 一、排序数组 1.1 题目 2.2 思路 2.3 代码实现 二、LCR 170. 交易逆序对的总数 (数组中的逆序对) 2.1 题目 2.2 思路 方法一:快速统计出某个数前面有多少个数比它大 方法二:快速统计出某个数后面有多少个数比它小 …...
51单片机使用定时器实现LCD1602的时间显示(STC89C52RC)
本文前半部分直接给出实现(注意进位问题是秒->分->小时,用 if 嵌套即可实现),后半部分讲解定时器和中断系统。 效果展示: LCD1602电路图: 项目结构: 代码实现: main.c #…...
微软2025年AI技术深度解析:从多模态大模型到企业级代理服务
微软2025年AI技术深度解析:从多模态大模型到企业级代理服务 一、微软AI技术全景概览 在2025年的AI领域,微软通过Azure AI Foundry、多模态大模型、企业级AI代理三大核心技术,构建了覆盖开发、部署、应用全流程的AI生态体系。根据最新财报数…...
24 设计模式总结
设计模式分类(意图) • 创建型模式:创建对象的机制,从所需要实例化的对象中解耦。 • 结构型模式:将对象或类组装到更大的结构中。 • 行为型模式:负责对象间的交互和分配职责。分类的目的是为了更抽象的了…...