目录

一. 树的概念和结构

1.1 树的基本概念

1.2 树的结构特点

二. 树的表示方法和实际运用

2.1 孩子 - 兄弟表示法(Child-Sibling Representation)

2.2 树的实际应用场景

三. 二叉树的概念

3.1 二叉树的核心定义

3.2 二叉树的基本分类

四. 二叉树的性质

性质 1:节点数量与层数的关系

性质 2:深度与总节点数的关系

性质 3:叶子节点与度为 2 的节点的关系

性质 4:完全二叉树的深度

性质 5:完全二叉树的节点索引关系

五. 二叉树的存储结构

一、顺序存储结构

二、链式存储结构


一. 树的概念和结构

在数据结构中,树(Tree) 是一种非线性的数据结构,它由节点(Node)和边(Edge)组成,用于表示具有层次关系的数据。树的结构类似于自然界中的树,具有 “根”、“枝”、“叶” 等概念,但其形态是 “倒置” 的(根在上,叶在下)。

由上图可以推测出  每一个节点只有向上和向下链接 如果出现了左右链接 则不是树结构 如下:

1.1 树的基本概念

  1. 节点(Node)
    树的基本组成单位,包含数据和指向子节点的引用(指针)。

  2. 根节点(Root)
    树的起点,没有父节点的节点(一棵树有且仅有一个根节点)。

  3. 父节点与子节点

    • 若节点 A 直接指向节点 B,则 A 是 B 的父节点,B 是 A 的子节点

    • 同一父节点的子节点互称为兄弟节点

  4. 叶子节点(Leaf)
    没有子节点的节点(即度为 0 的节点)。

  5. 度(Degree)
    一个节点拥有的子节点数量(叶子节点的度为 0,根节点的度至少为 1)。

  6. 深度(Depth)
    从根节点到当前节点的路径长度(根节点深度为 0 或 1,通常以 0 开始)。

  7. 高度(Height)
    从当前节点到最深叶子节点的路径长度(叶子节点高度为 0,根节点高度即树的高度)。

  8. 路径(Path)
    从一个节点到另一个节点经过的节点序列(树中路径唯一,无环)。

  9. 子树(Subtree)
    以某节点为根的所有后代节点组成的树(该节点及其子树是原树的一部分)。

1.2 树的结构特点

  1. 非线性结构:节点之间的关系不是线性的,而是层次化的。
  2. 无环性:任意两个节点之间有且仅有一条路径,不存在回路(环)。
  3. 根的唯一性:只有一个根节点,所有其他节点都直接或间接依附于根。
  4. 子树独立性:一棵树的子树之间互不相交(否则会形成环)。

二. 树的表示方法和实际运用

树的表示方法有很多 现在我向大家介绍孩子兄弟表示法

2.1 孩子 - 兄弟表示法(Child-Sibling Representation)

  • 原理:将任意树转换为二叉树结构,每个节点包含三个部分:
    • 数据域;
    • 第一个子节点指针(指向最左子节点);
    • 右兄弟节点指针(指向同一父节点的下一个兄弟节点)。
  • 结构示例(将多叉树转为二叉树):
          A/B → C → D  (B的右兄弟是C,C的右兄弟是D)/E → F        (E的右兄弟是F)
    
    (原树中 A 的子节点是 B、C、D;B 的子节点是 E、F)
  • 优点:将多叉树统一为二叉树结构,可复用二叉树的算法(如遍历、插入),节省空间。
  • 缺点:结构较抽象,需理解 “兄弟节点” 的转换逻辑。
  • 适用场景:多叉树与二叉树的转换(如森林的表示、语法树的存储)。
struct TreeNode
{struct Node* child; // 左边开始的第⼀个孩⼦结点struct Node* brother; // 指向其右边的下⼀个兄弟结点int data; // 结点中的数据域
};

2.2 树的实际应用场景

树的层次化、无环特性使其在解决具有 “父子关系”“层级分类” 的问题时极为高效,以下是典型场景:

1. 文件系统与目录结构

  • 原理:操作系统的文件和文件夹以树状组织,根目录为根节点,文件夹为中间节点,文件为叶子节点。
  • 示例:Windows 的C:\Users\Document\file.txt是一条从根到叶子的路径。
  • 优势:支持高效的路径查找(如cd命令遍历目录)和层级管理。

2. 数据库索引

  • 原理:B 树、B + 树等多叉树结构被用于数据库索引,平衡的树高保证了查询、插入、删除的高效性(时间复杂度 O (log n))。
  • 示例:MySQL 的 InnoDB 存储引擎使用 B + 树作为聚簇索引,叶子节点存储完整数据行,非叶子节点作为索引指引。

三. 二叉树的概念

下面向大家介绍树中最常见也是最常用的结构---二叉树

二叉树(Binary Tree)是一种特殊的树结构,每个节点最多有两个子节点,分别称为左子节点右子节点。这种 “最多两个子节点” 的特性使其结构相对简单,同时具备树的层次化、非线性特点,是数据结构中最常用的树类型之一。

从上图可以看出 二叉树即最多二分叉 所以最多只有两个子节点 下面看一下二叉树的核心定义

3.1 二叉树的核心定义

  1. 节点结构:每个节点包含三部分:

    • 数据域(存储节点值);
    • 左子节点指针(指向左侧子节点,无则为null);
    • 右子节点指针(指向右侧子节点,无则为null)。
  2. 基本特性

    • 根节点:无父节点的节点(二叉树有且仅有一个根节点,除非是空树)。
    • 叶子节点:左、右子节点均为null的节点(无子女)。
    • 子树:以某个节点的左 / 右子节点为根的树,称为该节点的左 / 右子树(子树本身也是二叉树)。
    • 层次(深度):根节点为第 1 层,其子节点为第 2 层,以此类推。
    • 高度:节点到最深叶子节点的路径长度(叶子节点高度为 1)。

3.2 二叉树的基本分类

  1. 空二叉树:没有任何节点的树。

  2. 满二叉树(Full Binary Tree)

    • 所有非叶子节点都有两个子节点
    • 所有叶子节点在同一层次(即最后一层)。
      例如
  3. 完全二叉树(Complete Binary Tree)

    • 除最后一层外,所有层的节点数都达到最大值;
    • 最后一层的节点从左到右连续排列(不允许右侧有空缺);
    • 满二叉树是完全二叉树的特例。
      例如(最后一层节点从左到右连续):

满二叉树属于一种特殊的完全二叉树 关系图如下

四. 二叉树的性质

性质 1:节点数量与层数的关系

第 i 层最多有 2^(i-1) 个节点i ≥ 1,层数从 1 开始计数)。

  • 推导:第 1 层(根节点)最多 1 个节点(2^0);第 2 层最多 2 个节点(2^1);第 3 层最多 4 个节点(2^2)…… 第i层最多为 2^(i-1) 个节点(每一层节点数是上一层的 2 倍,因每个节点最多 2 个子节点)。

性质 2:深度与总节点数的关系

深度为 k 的二叉树,最多有 2^k - 1 个节点k ≥ 1)。

  • 推导:总节点数为各层最大节点数之和,即 2^0 + 2^1 + 2^2 + ... + 2^(k-1) = 2^k - 1(等比数列求和)。

  • 特例:满二叉树的总节点数恰好为 2^k - 1(每一层都达到最大节点数)。

性质 3:叶子节点与度为 2 的节点的关系

对任何一棵二叉树,若叶子节点数为 n₀,度为 2 的节点数为 n₂,则 n₀ = n₂ + 1

  • 推导:

    1. 设度为 1 的节点数为 n₁,总节点数 N = n₀ + n₁ + n₂

    2. 二叉树中,除根节点外,每个节点都有且仅有一个父节点,因此总边数为 N - 1(边数 = 节点数 - 1)。

    3. 边数也可由节点的度计算:度为 1 的节点贡献 1 条边,度为 2 的节点贡献 2 条边,叶子节点(度为 0)贡献 0 条边,因此总边数 = n₁×1 + n₂×2

    4. 联立得:n₀ + n₁ + n₂ - 1 = n₁ + 2n₂,化简后 n₀ = n₂ + 1

性质 4:完全二叉树的深度

具有 n 个节点的完全二叉树,其深度为 ⌊log₂n⌋ + 1⌊x⌋ 表示向下取整)。

  • 推导:

    1. 设深度为 k,则完全二叉树的节点数 n 满足:
      深度为 k-1 的满二叉树节点数 < n ≤ 深度为 k 的满二叉树节点数,
      即 2^(k-1) - 1 < n ≤ 2^k - 1

    2. 不等式变形为 2^(k-1) ≤ n < 2^k,两边取对数得 k-1 ≤ log₂n < k,因此 k = ⌊log₂n⌋ + 1

性质 5:完全二叉树的节点索引关系

对有 n 个节点的完全二叉树,若按层次(从左到右)给节点编号(从 1 开始),则对任意节点 i1 ≤ i ≤ n):

  • 若 i > 1,则其父节点编号为 ⌊i/2⌋(左子节点的父节点为 i/2,右子节点的父节点为 (i-1)/2,统一为 ⌊i/2⌋)。

  • 若 2i ≤ n,则其左子节点编号为 2i;否则无左子节点(叶子节点)。

  • 若 2i + 1 ≤ n,则其右子节点编号为 2i + 1;否则无右子节点。

  • 例:编号为 3 的节点,父节点为 ⌊3/2⌋ = 1,左子节点为 6(若存在),右子节点为 7(若存在)。

这些性质是二叉树遍历、构建(如堆的实现)、操作(如查找父 / 子节点)的理论基础,尤其在完全二叉树和满二叉树中应用广泛。

五. 二叉树的存储结构

二叉树的存储结构需要兼顾其逻辑特性(节点间的父子关系)和操作效率(如访问子节点、父节点),常见的存储方式有两种:顺序存储结构链式存储结构

一、顺序存储结构

顺序存储通过数组存储二叉树的节点,利用节点在数组中的索引位置反映其逻辑关系(父子、左右兄弟)。
适用场景:完全二叉树(或满二叉树),此时数组空间利用率最高;非完全二叉树会浪费较多空间。

存储规则

层次遍历顺序(从根到叶,每层从左到右)将节点存入数组,索引从 0 或 1 开始(通常从 1 开始,便于计算父子关系)。
假设数组索引从 1 开始,对于任意节点 i

  • 左子节点索引:2i(若存在);
  • 右子节点索引:2i + 1(若存在);
  • 父节点索引:i // 2i > 1 时)。

示例

完全二叉树的顺序存储:

优缺点

  • 优点:访问子节点 / 父节点效率高(通过公式直接计算索引,时间复杂度 O(1));适合完全二叉树(无空间浪费)。
  • 缺点:非完全二叉树需用 null 填充空缺位置,空间利用率低;插入 / 删除节点时可能需要大量移动元素,效率低。

二、链式存储结构

链式存储通过指针(或引用) 连接节点,每个节点存储自身数据及指向子节点的指针,更灵活地表示任意二叉树。

节点结构

每个节点包含 3 个域:

  • 数据域:存储节点的值;
  • 左指针域:指向左子节点(left);
  • 右指针域:指向右子节点(right)。
// C语言示例
typedef struct BiTNode {int data;                  // 数据域struct BiTNode *left;      // 左子节点指针struct BiTNode *right;     // 右子节点指针
} BiTNode, *BiTree;

任意二叉树的链式存储:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/96598.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/96598.shtml
英文地址,请注明出处:http://en.pswp.cn/web/96598.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt/C++,windows多进程demo

1. 项目概述 最近研究了一下Qt/C框架下&#xff0c;windows版本的多进程编写方法&#xff0c;实现了一个小demo。下面详细介绍一下。 MultiProcessDemo是一个基于Qt框架实现的多进程应用程序示例&#xff0c;展示了如何在Windows平台上通过共享内存和事件机制实现进程间通信。该…

Android SystemServer 系列专题【篇五:UserController用户状态控制】

本篇接着SystemServer的启动流程&#xff0c;围绕SystemServer最后阶段关于主用户的启动和解锁的流程&#xff0c;作为切入点&#xff0c;来看看SystemServer是如何讲用户状态同步到所有的系统级服务中。ssm.onStartUserssm.onUnlockingUserssm.onUnlockedUser本篇先介绍UserCo…

推荐使用 pnpm 而不是 npm

npm 的局限性 磁盘空间浪费在 npm 早期版本中&#xff0c;每个项目的node_modules目录都会完整复制所有依赖包&#xff0c;即使多个项目依赖同一个包的相同版本&#xff0c;也会重复存储。这导致磁盘空间被大量占用&#xff0c;随着项目数量的增加&#xff0c;存储成本显著上升…

Transformer实战(18)——微调Transformer语言模型进行回归分析

Transformer实战&#xff08;18&#xff09;——微调Transformer语言模型进行回归分析0. 前言1. 回归模型2. 数据处理3. 模型构建与训练4. 模型推理小结系列链接0. 前言 在自然语言处理领域中&#xff0c;预训练 Transformer 模型不仅能胜任离散类别预测&#xff0c;也可用于连…

【Linux】【实战向】Linux 进程替换避坑指南:从理解 bash 阻塞等待,到亲手实现能执行 ls/cd 的 Shell

前言&#xff1a;欢迎各位光临本博客&#xff0c;这里小编带你直接手撕&#xff0c;文章并不复杂&#xff0c;愿诸君耐其心性&#xff0c;忘却杂尘&#xff0c;道有所长&#xff01;&#xff01;&#xff01;&#xff01; IF’Maxue&#xff1a;个人主页&#x1f525; 个人专栏…

linux常用命令 (3)——系统包管理

博客主页&#xff1a;christine-rr-CSDN博客 ​​​​​ ​​ hi&#xff0c;大家好&#xff0c;我是christine-rr ! 今天来分享一下linux常用命令——系统包管理 目录linux常用命令---系统包管理&#xff08;一&#xff09;Debian 系发行版&#xff08;Ubuntu、Debian、Linux …

YOLOv8 mac-intel芯片 部署指南

&#x1f680; 在 Jupyter Notebook 和 PyCharm 中使用 Conda 虚拟环境&#xff08;YOLOv8 部署指南&#xff0c;Python 3.9&#xff09; YOLOv8 是 Ultralytics 开源的最新目标检测模型&#xff0c;轻量高效&#xff0c;支持分类、检测、分割等多种任务。 在 Mac&#xff08;…

【高等数学】第十一章 曲线积分与曲面积分——第六节 高斯公式 通量与散度

上一节&#xff1a;【高等数学】第十一章 曲线积分与曲面积分——第五节 对坐标的曲面积分 总目录&#xff1a;【高等数学】 目录 文章目录1. 高斯公式2. 沿任意闭曲面的曲面积分为零的条件3. 通量与散度1. 高斯公式 设空间区域ΩΩΩ是由分片光滑的闭曲面ΣΣΣ所围成&#x…

IDEA试用过期,无法登录,重置方法

IDEA过期&#xff0c;重置方法: IntelliJ IDEA 2024.2.0.2 (亲测有效) 最新Idea重置办法!&#xff1a; 方法一&#xff1a; 1、删除C:\Users\{用户名}\AppData\Local\JetBrains\IntelliJIdea2024.2 下所有文件(注意&#xff1a;是子目录全部删除) 2、删除C:\Users\{用户名}\App…

创建用户自定义桥接网络并连接容器

1.创建用户自定义的 alpine-net 网络[roothost1 ~]# docker network create --driver bridge alpine-net 9f6d634e6bd7327163a9d83023e435da6d61bc6cf04c9d96001d1b64eefe4a712.列出 Docker 主机上的网络[roothost1 ~]# docker network ls NETWORK ID NAME DRIVER …

Vue3 + Vite + Element Plus web转为 Electron 应用,解决无法登录、隐藏自定义导航栏

如何在vue3 Vite Element Plus搭好的架构下转为 electron应用呢&#xff1f; https://www.electronjs.org/zh/docs/latest/官方文档 https://www.electronjs.org/zh/docs/latest/ 第一步&#xff1a;安装 electron相关依赖 npm install electron electron-builder concurr…

qt QAreaLegendMarker详解

1. 概述QAreaLegendMarker 是 Qt Charts 模块中的一部分&#xff0c;用于在图例&#xff08;Legend&#xff09;中表示 QAreaSeries 的标记。它负责显示区域图的图例项&#xff0c;通常包含区域颜色样例和对应的描述文字。图例标记和对应的区域图关联&#xff0c;显示区域的名称…

linux 函数 kstrtoul

kstrtoul 函数概述 kstrtoul 是 Linux 内核中的一个函数&#xff0c;用于将字符串转换为无符号长整型&#xff08;unsigned long&#xff09;。该函数定义在 <linux/kernel.h> 头文件中&#xff0c;常用于内核模块中解析用户空间传递的字符串参数。 函数原型 int kstrtou…

LLM(三)

一、人类反馈的强化学习&#xff08;RLHF&#xff09;微调的目标是通过指令&#xff0c;包括路径方法&#xff0c;进一步训练你的模型&#xff0c;使他们更好地理解人类的提示&#xff0c;并生成更像人类的回应。RLHF&#xff1a;使用人类反馈微调型语言模型&#xff0c;使用强…

DPO vs PPO,偏好优化的两条技术路径

1. 背景在大模型对齐&#xff08;alignment&#xff09;里&#xff0c;常见的两类方法是&#xff1a;PPO&#xff1a;强化学习经典算法&#xff0c;OpenAI 在 RLHF 里用它来“用奖励模型更新策略”。DPO&#xff1a;2023 年提出的新方法&#xff08;参考论文《Direct Preferenc…

BLE6.0信道探测,如何重构物联网设备的距离感知逻辑?

在物联网&#xff08;IoT&#xff09;无线通信技术快速渗透的当下&#xff0c;实现人与物、物与物之间对物理距离的感知响应能力已成为提升设备智能高度与人们交互体验的关键所在。当智能冰箱感知用户靠近而主动亮屏显示内部果蔬时、当门禁系统感知到授权人士靠近而主动开门时、…

【计算机 UTF-8 转换为本地编码的含义】

UTF-8 转换为本地编码的含义 详细解释一下"UTF-8转换为本地编码"的含义以及为什么在处理中文时这很重要。 基本概念 UTF-8 编码 国际标准&#xff1a;UTF-8 是一种能够表示世界上几乎所有字符的 Unicode 编码方式跨平台兼容&#xff1a;无论在哪里&#xff0c;UTF-8 …

4.6 变体

1.变体简介 2.为什么需要变体 3.变体是如何产生的 4.变体带来的麻烦 5.multi_compile和shader_feature1.变体简介 比如我们开了一家餐厅, 你有一本万能的菜单(Shader源代码), 上面包含了所有可能的菜式; 但是顾客每次来点餐时, 不可能将整本菜单都做一遍, 他们会根据今天有没有…

猿辅导Android开发面试题及参考答案(下)

为什么开发中要使用线程池,而不是直接创建线程(如控制线程数量、复用线程、降低开销)? 开发中优先使用线程池而非直接创建线程,核心原因是线程池能优化线程管理、降低资源消耗、提高系统稳定性,而直接创建线程存在难以解决的缺陷,具体如下: 控制线程数量,避免资源耗尽…

【网络通信】IP 地址深度解析:从技术原理到企业级应用​

IP 地址深度解析&#xff1a;从技术原理到企业级应用​ 文章目录IP 地址深度解析&#xff1a;从技术原理到企业级应用​前言一、基础认知&#xff1a;IP 地址的技术定位与核心特性​1.1 定义与网络层角色1.2 核心属性与表示法深化二、地址分类&#xff1a;从类别划分到无类别路…