算法与数据结构 - 二叉树结构入门

news2025/5/16 8:59:15

目录

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 root
    if 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 None
    if 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.right
        if not root.right:
            return root.left
        # 找右子树的最小节点
        temp = root.right
        while temp.left:
            temp = temp.left
        root.val = temp.val
        root.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. 核心特性
  1. 平衡因子(Balance Factor)

    • 对于任意节点,平衡因子 = 左子树高度 - 右子树高度

    • 合法值:-1、0、1

  2. 高度平衡

    • 保证树的高度始终为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. 基本概念

红黑树通过以下规则保持平衡:

  1. 节点颜色:每个节点是红色或黑色

  2. 根节点:根节点必须是黑色

  3. 叶子节点:所有叶子节点(NIL节点,空节点)都是黑色

  4. 红色节点规则:红色节点的两个子节点都必须是黑色(即不能有连续的红色节点)

  5. 黑高一致:从任一节点到其每个叶子节点的所有路径都包含相同数目的黑色节点(称为"黑高")

2.3.2. 核心特性
  1. 近似平衡:虽然不如AVL树严格平衡,但能保证最长路径不超过最短路径的两倍

  2. 高效操作:插入、删除和查找操作的时间复杂度都是O(log n)

  3. 旋转次数少:相比AVL树,红黑树在插入和删除时需要的旋转操作更少

2.3.3. 平衡操作

1. 插入操作

  1. 按照二叉搜索树规则插入新节点(初始设为红色)

  2. 检查并修复红黑树性质:

    • 情况1:新节点是根节点 → 变为黑色

    • 情况2:父节点是黑色 → 无需处理

    • 情况3:父节点和叔节点都是红色 → 重新着色

    • 情况4:父节点红而叔节点黑(或不存在)→ 旋转+重新着色

2. 删除操作

  1. 执行标准BST删除

  2. 如果删除的是红色节点,性质保持不变

  3. 如果删除的是黑色节点,需要通过旋转和重新着色来修复性质

旋转操作

红黑树使用两种基本旋转(与AVL树类似):

  1. 左旋

        P              Q
       / \            / \
      A   Q   →      P   C
         / \        / \
        B   C      A   B
  2. 右旋

        P              Q
       / \            / \
      Q   C   →      A   P
     / \                / \
    A   B              B   C

3. 总结

我们可以看到 AVL 树和红黑树其实是二叉搜索树的变种。AVL 和 红黑树的代码相对比较复杂,涉及复杂的旋转问题。具体的代码,将在之后的博文里讨论。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何使用远程桌面控制电脑

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

SpringMVC-执行流程

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

计算机网络网络层(下)

一、互联的路由选择协议&#xff08;网络层控制层面内容&#xff09; &#xff08;一&#xff09;有关路由选择协议的几个概念 1.理想的路由算法 &#xff08;1&#xff09;理想路由算法应具备的特点&#xff1a;算法必须正确和完整的&#xff0c;算法在计算上应简单&#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、监听…

大模型核心运行机制

大模型核心运行机制目录 一、核心架构&#xff1a;Transformer的演进与改进1.1 核心组件包括&#xff1a;1.1.1 自注意力机制&#xff08;Self-Attention&#xff09;1.1.2 多头注意力&#xff08;Multi-Head Attention&#xff09;1.1.3 位置编码&#xff08;Positional Encod…

uniapp跨平台开发HarmonyOS NEXT应用初体验

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

2025软考【系统架构设计师】:两周极限冲刺攻略(附知识点解析+答题技巧)

距离2025上半年“系统架构设计师”考试已经只剩最后两周了&#xff0c;还没有准备好的小伙伴赶紧行动起来。为了帮助大家更好的冲刺学习&#xff0c;特此提供一份考前冲刺攻略。本指南包括考情分析、答题技巧、注意事项三个部分&#xff0c;可以参考此指南进行最后的复习要领&a…

使用 goaccess 分析 nginx 访问日志

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

vue3与springboot交互-前后分离【完成登陆验证及页面跳转】

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

【Hot 100】208. 实现 Trie (前缀树)

目录 引言实现 Trie (前缀树)我的解题代码解析代码思路分析优化建议1. 内存泄漏问题2. 使用智能指针优化内存管理3. 输入合法性校验&#xff08;可选&#xff09;4. 其他优化 总结 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;算法专栏&#x1…

【2025最新】Vm虚拟机中直接使用Ubuntu 免安装过程直接使用教程与下载

Ubuntu 是一个基于 Debian 的自由开源 Linux 操作系统&#xff0c;面向桌面、服务器和云计算平台广泛应用。 由英国公司 Canonical Ltd. 维护和发布&#xff0c;Ubuntu 强调易用性、安全性和稳定性&#xff0c;适合个人用户、开发者以及企业部署使用。 Ubuntu 默认使用 GNOME …

Vue2 elementUI 二次封装命令式表单弹框组件

需求&#xff1a;封装一个表单弹框组件&#xff0c;弹框和表单是两个组件&#xff0c;表单组件以插槽的形式动态传入弹框组件中。 外部组件使用的方式如下&#xff1a; 直接上代码&#xff1a; MyDialog.vue 弹框组件 <template><el-dialog:titletitle:visible.syn…

Antd中Form详解:

1.获取Form表单值的方式: ① 使用Form.useForm()钩子&#xff08;推荐方式&#xff09; const [form] Form.useForm();const getFormValues () > {const values form.getFieldsValue();};<Form form{form}>...<Form.Item label{null}><Button onClick{ge…

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 需要启用 虚拟化技…

《基于 Kubernetes 的 WordPress 高可用部署实践:从 MariaDB 到 Nginx 反向代理》

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

Ubuntu源码版comfyui的安装

Comfyui也出桌面版了&#xff0c;但是想让大家多个人都使用怎么办呢&#xff1f;也有方法&#xff0c;安装Linux版&#xff0c;启动后会生成个网页地址&#xff0c;打开就能用了。 1、先来看下本地安装环境配置&#xff1a; 系统&#xff1a;Ubuntu 22.04 内存&#xff1a;2…

制作一款打飞机游戏47:跳转

编辑器的问题 我们开始为不同的敌人编写一些行为&#xff0c;到目前为止进展顺利&#xff0c;一切都很棒。但上次我们遇到了一些问题&#xff0c;我们发现在这个编辑器中编写代码有时有点困难&#xff0c;因为当你想要在某行之间插入内容时&#xff0c;你不得不删除一切然后重…

本地部署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…

vue H5解决安卓手机软键盘弹出,页面高度被顶起

开发中安卓机上遇到的软键盘弹出导致布局问题 直接上代码_ 在这里插入代码片 <div class"container"><div class"appContainer" :style"{height:isKeyboardOpen? Heights :inherit}"><p class"name"><!-- 绑定…

CSS专题之自定义属性

前言 石匠敲击石头的第 12 次 CSS 自定义属性是现代 CSS 的一个强大特性&#xff0c;可以说是前端开发需知、必会的知识点&#xff0c;本篇文章就来好好梳理一下&#xff0c;如果哪里写的有问题欢迎指出。 什么是 CSS 自定义属性 CSS 自定义属性英文全称是 CSS Custom Proper…