c++程序设计速学笔记3复杂数据结构

news2026/2/13 21:54:41

树(Trees)

树是一种非线性数据结构,用于表示具有层次关系的数据。树由节点(nodes)组成,节点之间通过边(edges)连接。树的根节点(root node)位于顶部,其他节点通过分支(branches)连接。树的每个节点可以有零个或多个子节点(child nodes),没有子节点的节点称为叶节点(leaf nodes)。

树的基本术语

  1. 节点(Node): 树中的基本单元,包含数据和指向其子节点的链接。
  2. 根节点(Root Node): 树的最顶端节点,没有父节点。
  3. 父节点(Parent Node): 一个节点的上一级节点。
  4. 子节点(Child Node): 一个节点的下一级节点。
  5. 叶节点(Leaf Node): 没有子节点的节点。
  6. 兄弟节点(Sibling Nodes): 具有相同父节点的节点。
  7. 路径(Path): 从一个节点到另一个节点的序列。
  8. 深度(Depth): 从根节点到某节点的路径长度。
  9. 高度(Height): 从某节点到其最远叶节点的路径长度。
  10. 子树(Subtree): 以某个节点为根的树。

常见的树类型

  1. 二叉树(Binary Tree): 每个节点最多有两个子节点,分别称为左子节点和右子节点。特殊形式包括完全二叉树、满二叉树、平衡二叉树等。
  2. 二叉搜索树(Binary Search Tree, BST):
    二叉树的一种,其中每个节点的左子树中的所有节点的值都小于该节点的值,右子树中的所有节点的值都大于该节点的值。
    支持高效的查找、插入和删除操作。
  3. AVL树: 一种自平衡二叉搜索树,任何节点的两个子树的高度最大差别为1。 保证了树的高度总是对数级别的,从而保证了高效的操作。
  4. 红黑树(Red-Black Tree): 一种自平衡二叉搜索树,通过颜色属性来保持树的平衡。 广泛应用于各种数据结构和算法中,如 C++
    标准库中的 std::set 和 std::map。
  5. B树: 一种自平衡的搜索树,可以有多个子节点。 常用于文件系统和数据库系统中,支持高效的磁盘读写操作。
  6. B+树: B树的一种变体,所有数据都存储在叶节点上,叶节点之间有指针相连。 适合用于外部存储,如数据库索引。
  7. 堆(Heap): 一种特殊的完全二叉树,分为最大堆和最小堆。 最大堆中每个节点的值都大于或等于其子节点的值,最小堆则相反。
    常用于实现优先队列。

树的应用

  1. 文件系统: 文件系统中的目录结构可以用树来表示,每个目录是一个节点,文件是叶节点。
  2. 数据库索引: B树和B+树广泛用于数据库索引,支持高效的查找和范围查询。
  3. 编译器: 编译器中的语法树用于表示程序的结构,便于解析和优化。
  4. 网络路由: 路由表可以用树来表示,支持高效的路由查找。
  5. 游戏AI: 游戏中的决策树可以用来表示不同的策略和动作。

树的遍历

  1. 前序遍历(Pre-order Traversal): 访问根节点 -> 递归遍历左子树 -> 递归遍历右子树。
  2. 中序遍历(In-order Traversal): 递归遍历左子树 -> 访问根节点 -> 递归遍历右子树。二叉搜索树的中序遍历结果是有序的。
  3. 后序遍历(Post-order Traversal): 递归遍历左子树 -> 递归遍历右子树 -> 访问根节点。
  4. 层次遍历(Level-order Traversal): 按照从上到下、从左到右的顺序逐层访问节点。
#include <iostream>

struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

void preorderTraversal(TreeNode* root) {
    if (root == nullptr) return;
    std::cout << root->val << " ";
    preorderTraversal(root->left);
    preorderTraversal(root->right);
}

void inorderTraversal(TreeNode* root) {
    if (root == nullptr) return;
    inorderTraversal(root->left);
    std::cout << root->val << " ";
    inorderTraversal(root->right);
}

void postorderTraversal(TreeNode* root) {
    if (root == nullptr) return;
    postorderTraversal(root->left);
    postorderTraversal(root->right);
    std::cout << root->val << " ";
}

int main() {
    // 创建一个简单的二叉树
    TreeNode* root = new TreeNode(1);
    root->left = new TreeNode(2);
    root->right = new TreeNode(3);
    root->left->left = new TreeNode(4);
    root->left->right = new TreeNode(5);

    std::cout << "Pre-order traversal: ";
    preorderTraversal(root);
    std::cout << std::endl;

    std::cout << "In-order traversal: ";
    inorderTraversal(root);
    std::cout << std::endl;

    std::cout << "Post-order traversal: ";
    postorderTraversal(root);
    std::cout << std::endl;

    // 清理内存
    delete root->left->left;
    delete root->left->right;
    delete root->left;
    delete root->right;
    delete root;

    return 0;
}

图(Graphs)

图(Graph)是一种非线性数据结构,用于表示对象之间的复杂关系。图由节点(顶点,Vertices)和边(Edges)组成,可以用来表示多种现实世界的问题,如社交网络、交通网络、计算机网络等。

图的基本概念

  1. 顶点(Vertex): 图中的基本单元,表示一个实体或对象。
  2. 边(Edge): 连接两个顶点的线,表示顶点之间的关系。
  3. 权重(Weight): 边上的数值,表示边的某种属性,如距离、成本等。
  4. 有向图(Directed Graph): 边有方向的图,表示从一个顶点到另一个顶点的单向关系。
  5. 无向图(Undirected Graph): 边没有方向的图,表示两个顶点之间的双向关系。
  6. 邻接(Adjacency): 如果两个顶点之间有一条边直接相连,则称这两个顶点是相邻的。
  7. 路径(Path): 从一个顶点到另一个顶点的一系列边。
  8. 连通图(Connected Graph): 无向图中任意两个顶点之间都存在路径。
  9. 强连通图(Strongly Connected Graph): 有向图中任意两个顶点之间都存在路径。
  10. 环(Cycle): 一条从一个顶点出发,经过若干个顶点后回到起点的路径。
  11. 度(Degree): 顶点的度表示与该顶点相连的边的数量。
  12. 入度(In-degree):有向图中进入一个顶点的边的数量。
  13. 出度(Out-degree):有向图中从一个顶点出发的边的数量。

图的表示方法

  1. 邻接矩阵(Adjacency Matrix): 一个二维数组,A[i][j] 表示顶点 i 和顶点 j 之间的关系。适用于稠密图,占用空间较大。
  2. 邻接表(Adjacency List): 一个数组,每个元素是一个链表,链表中的每个节点表示与当前顶点相邻的顶点。适用于稀疏图,占用空间较小。
  3. 边列表(Edge List): 一个数组或列表,每个元素是一个边的表示(如一对顶点)。 适用于简单图,不便于快速查找顶点的邻居。

图的常见操作

  1. 添加顶点: 在图中增加一个新的顶点。
  2. 添加边: 在图中增加一条新的边。
  3. 删除顶点: 从图中移除一个顶点及其相关的边。
  4. 删除边: 从图中移除一条边。
  5. 查找顶点: 判断图中是否存在某个顶点。
  6. 查找边: 判断图中是否存在某条边。

遍历图:

  1. 深度优先搜索(DFS):从一个顶点开始,沿着一条路径尽可能深入地访问顶点,直到无法继续为止,然后回溯。
  2. 广度优先搜索(BFS):从一个顶点开始,先访问其所有相邻的顶点,再依次访问这些顶点的相邻顶点。

图的应用

  1. 社交网络: 表示用户之间的关系,如好友关系、关注关系等。
  2. 交通网络: 表示城市之间的道路连接,用于路径规划和交通流量分析。
  3. 计算机网络: 表示设备之间的连接,用于网络拓扑分析和路由选择。
  4. 推荐系统: 表示用户和物品之间的关系,用于个性化推荐。
  5. 地图应用: 表示地理位置之间的连接,用于导航和路线规划。
  6. 电路设计: 表示电路元件之间的连接,用于电路仿真和优化。

简单的无向图的实现及其深度优先搜索和广度优先搜索

#include <iostream>
#include <vector>
#include <queue>
#include <stack>

class Graph {
public:
    Graph(int n) : n(n), adj(n) {}

    void addEdge(int u, int v) {
        adj[u].push_back(v);
        adj[v].push_back(u); // 无向图
    }

    void DFS(int start) {
        std::vector<bool> visited(n, false);
        dfsUtil(start, visited);
    }

    void BFS(int start) {
        std::vector<bool> visited(n, false);
        bfsUtil(start, visited);
    }

private:
    int n;
    std::vector<std::vector<int>> adj;

    void dfsUtil(int u, std::vector<bool>& visited) {
        visited[u] = true;
        std::cout << u << " ";

        for (int v : adj[u]) {
            if (!visited[v]) {
                dfsUtil(v, visited);
            }
        }
    }

    void bfsUtil(int start, std::vector<bool>& visited) {
        std::queue<int> q;
        visited[start] = true;
        q.push(start);

        while (!q.empty()) {
            int u = q.front();
            q.pop();
            std::cout << u << " ";

            for (int v : adj[u]) {
                if (!visited[v]) {
                    visited[v] = true;
                    q.push(v);
                }
            }
        }
    }
};

int main() {
    Graph g(4);
    g.addEdge(0, 1);
    g.addEdge(0, 2);
    g.addEdge(1, 2);
    g.addEdge(2, 3);

    std::cout << "Depth First Traversal (starting from vertex 0): ";
    g.DFS(0);
    std::cout << std::endl;

    std::cout << "Breadth First Traversal (starting from vertex 0): ";
    g.BFS(0);
    std::cout << std::endl;

    return 0;
}

堆(Heap)

堆(Heap)是一种特殊的完全二叉树,通常用于实现优先队列(Priority Queue)。堆有两种主要类型:最大堆(Max Heap)和最小堆(Min Heap)。在这两种堆中,每个节点的值都满足一定的条件,使得堆的根节点具有特殊的意义。

堆的基本概念

  1. 节点(Node): 堆中的基本单元,包含数据。
  2. 根节点(Root Node): 堆的最顶端节点,通常位于数组的索引 0 位置。
  3. 父节点(Parent Node): 一个节点的上一级节点。对于索引为 i 的节点,其父节点的索引为 (i - 1) / 2。
  4. 子节点(Child Node): 一个节点的下一级节点。对于索引为 i 的节点,其左子节点的索引为 2 * i + 1,右子节点的索引为
    2 * i + 2。

堆的类型

  1. 最大堆(Max Heap): 每个节点的值都大于或等于其子节点的值。根节点是堆中最大的元素。
  2. 最小堆(Min Heap): 每个节点的值都小于或等于其子节点的值。 根节点是堆中最小的元素。

堆的操作

  1. 插入元素(Insert): 将新元素添加到堆的末尾。 通过“上滤”(Percolate Up)操作,将新元素移动到合适的位置,以保持堆的性质。
  2. 删除根节点(Delete Root): 移除根节点。 将最后一个元素移到根节点的位置。 通过“下滤”(Percolate Down)操作,将新根节点移动到合适的位置,以保持堆的性质。
  3. 构建堆(Build Heap): 从一个无序数组构建堆。 通过“下滤”操作,从最后一个非叶子节点开始,逐步调整堆的结构。 堆的应用优先队列(Priority Queue): 堆是实现优先队列的常用数据结构,支持高效的插入和删除操作。
  4. 堆排序(Heap Sort): 一种基于堆的排序算法,时间复杂度为 O(n log n)。
  5. Dijkstra算法: 用于求解单源最短路径问题,优先队列通常使用堆来实现。
  6. Huffman编码: 用于数据压缩,构建最优前缀码树时使用最小堆。

简单的最小堆的实现及其基本操作

#include <iostream>
#include <vector>
#include <algorithm>

class MinHeap {
public:
    MinHeap() {}

    void insert(int value) {
        heap.push_back(value);
        percolateUp(heap.size() - 1);
    }

    int extractMin() {
        if (heap.empty()) {
            throw std::runtime_error("Heap is empty");
        }
        int min = heap[0];
        heap[0] = heap.back();
        heap.pop_back();
        percolateDown(0);
        return min;
    }

    int getMin() const {
        if (heap.empty()) {
            throw std::runtime_error("Heap is empty");
        }
        return heap[0];
    }

    bool empty() const {
        return heap.empty();
    }

    size_t size() const {
        return heap.size();
    }

private:
    std::vector<int> heap;

    void percolateUp(int index) {
        while (index > 0) {
            int parent = (index - 1) / 2;
            if (heap[parent] <= heap[index]) {
                break;
            }
            std::swap(heap[parent], heap[index]);
            index = parent;
        }
    }

    void percolateDown(int index) {
        int n = heap.size();
        while (true) {
            int left = 2 * index + 1;
            int right = 2 * index + 2;
            int smallest = index;

            if (left < n && heap[left] < heap[smallest]) {
                smallest = left;
            }
            if (right < n && heap[right] < heap[smallest]) {
                smallest = right;
            }

            if (smallest == index) {
                break;
            }

            std::swap(heap[index], heap[smallest]);
            index = smallest;
        }
    }
};

int main() {
    MinHeap heap;
    heap.insert(3);
    heap.insert(1);
    heap.insert(4);
    heap.insert(1);
    heap.insert(5);
    heap.insert(9);

    std::cout << "Min element: " << heap.getMin() << std::endl;

    while (!heap.empty()) {
        std::cout << heap.extractMin() << " ";
    }
    std::cout << std::endl;

    return 0;
}

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

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

相关文章

基于vue+neo4j 的中药方剂知识图谱可视化系统

前言 历时一周时间&#xff0c;中药大数据R02系统中药开发完毕&#xff0c;该系统通过scrapy工程获取中药数据&#xff0c;使用python pandas预处理数据生成知识图谱和其他相关数据&#xff0c;利用vuespringbootneo4jmysql 开发系统&#xff0c;具体功能请看本文介绍。 简要…

Java——》try-with-resource

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

数据结构---二叉树(顺序结构),堆(上)

树 树的概念与结构 树是⼀种⾮线性的数据结构&#xff0c;它是由 n&#xff08;n>0&#xff09; 个有限结点组成⼀个具有层次关系的集合。把它叫做树是因为它看起来像⼀棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;⽽叶朝下的。 PS 有⼀个特殊的结点&#xff…

蓝桥杯-网络安全比赛题目-遗漏的压缩包

小蓝同学给你发来了他自己开发的网站链接&#xff0c; 他说他故意留下了一个压缩包文件&#xff0c;里面有网站的源代码&#xff0c; 他想考验一下你的网络安全技能。 &#xff08;点击“下发赛题”后&#xff0c;你将得到一个http链接。如果该链接自动跳转到https&#xff0c;…

HTB:Busqueda[WriteUP]

目录 连接至HTB服务器并启动靶机 使用nmap对靶机进行开放端口扫描 使用ffuf对该域名进行路径FUZZ 直接使用浏览器访问靶机80端口主页面 直接到Github上寻找相关PoC、EXP USER_FLAG&#xff1a;0f2686aebbdb4c728050281a6fb742cf 特权提升 ROOT_FLAG&#xff1a;dde68ef…

如何创建备份设备以简化 SQL Server 备份过程?

SQL Server 中的备份设备是什么&#xff1f; 在 SQL Server 中&#xff0c;备份设备是用于存储备份数据的物理或逻辑介质。备份设备可以是文件、设备或其他存储介质。主要类型包括&#xff1a; 文件备份设备&#xff1a;通常是本地文件系统中的一个或多个文件。可以是 .bak 文…

c语言-8进制的表示方法

文章目录 一、8进制二、输出格式三、范围限制四、八进制的负数五、程序 一、8进制 在C语言中&#xff0c;表示8进制数需要使用前缀数字0&#xff0c;而不是通常的o或者0x. 8进制数以数字0作为前缀&#xff0c;后面跟着一串八进制数字&#xff08;0-7&#xff09;组成&#xf…

python操作MySQL以及SQL综合案例

1.基础使用 学习目标&#xff1a;掌握python执行SQL语句操作MySQL数据库软件 打开cmd下载安装 安装成功 connection就是一个类&#xff0c;conn类对象。 因为位置不知道&#xff0c;所以使用关键字传参。 表明我们可以正常连接到MySQL 演示、执行非查询性质的SQL语句 pytho…

【含开题报告+文档+源码】基于SSM的物流管理系统设计与实现

开题报告 随着电子商务的迅猛发展和人们生活水平的提高&#xff0c;快递服务行业正经历着前所未有的增长。占航快递公司作为国内知名的快递企业之一&#xff0c;面临着巨大的机遇和挑战。传统的快递服务管理方式已经无法满足日益增长的业务需求&#xff0c;快递服务流程中的问…

外包干了2年,快要废了。。。

先说一下自己的情况&#xff0c;普通本科毕业&#xff0c;在外包干了2年多的功能测试&#xff0c;这几年因为大环境不好&#xff0c;我整个人心惊胆战的&#xff0c;怕自己卷铺盖走人了&#xff0c;我感觉自己不能够在这样蹉跎下去了&#xff0c;长时间呆在一个舒适的环境真的会…

界面控件DevExpress WPF中文教程:Data Grid——卡片视图设置

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

使用Matlab神经网络工具箱

综述 在大数据和人工智能时代&#xff0c;深度学习是一种最为常见的数据分析和拟合工具。本报告以常用分析软件Matlab为例&#xff0c;介绍如何通过编写代码实现一个简单的CNN卷积神经网络。 Step 1: 打开matlab&#xff0c;新建脚本 1、安装matlab 2018以上版本后&#xff…

【系统设计——认证授权——基本概念知识】

1. 认证和授权的区别 Authentication&#xff08;认证&#xff09; 是验证您的身份的凭据&#xff08;例如用户名/用户 ID 和密码&#xff09;&#xff0c;通过这个凭据&#xff0c;系统得以知道你就是你&#xff0c;也就是说系统存在你这个用户。所以&#xff0c;Authenticat…

区块链技术入门:以太坊智能合约详解

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 区块链技术入门&#xff1a;以太坊智能合约详解 区块链技术入门&#xff1a;以太坊智能合约详解 区块链技术入门&#xff1a;以太…

【Spring】更加简单的将对象存入Spring中并使用

前言 本期讲解&#xff1a;通过Controller、Service、Repository、Component、Configurtion类注解、Bean方法注解&#xff0c;来更加简单的在Spring中存与读对象。 目录 1. 类注解 1.1 通过标签 1.2 使用类注解 1.3 什么是类注解 1.4 获取Bean对象命名问题 2. 方法注解 …

Vue(JavaScript)读取csv表格并求某一列之和(大浮点数处理: decimal.js)

文章目录 想要读这个表格&#xff0c;并且求第二列所有价格的和方法一&#xff1a;通过添加文件输入元素上传csv完整&#xff08;正确&#xff09;代码之前的错误部分因为价格是小数&#xff0c;所以下面的代码出错。如果把parseFloat改成parseInt&#xff0c;那么求和没有意义…

火山引擎云服务docker 安装

安装 Docker 登录云服务器。 执行以下命令&#xff0c;添加 yum 源。 yum update -y yum install epel-release -y yum clean all yum list依次执行以下命令&#xff0c;添加Docker CE镜像源。更多操作请参考Docker CE镜像。 # 安装必要的一些系统工具 sudo yum install -y yu…

人保财险(外包)面试分享

前言&#xff1a; 这是本月面的第三家公司&#xff0c;太难了兄弟们&#xff0c;外包都不好找了&#xff0c;临近年底&#xff0c;金九银十已经错过了&#xff0c;金三银四虽然存在&#xff0c;但按照这几年的行情&#xff0c;金九银十和金三银四其实已经是不复存在了&#xf…

【D3.js in Action 3 精译_039】4.3 D3 面积图的绘制方法及其边界标签的添加

当前内容所在位置&#xff1a; 第四章 直线、曲线与弧线的绘制 ✔️ 4.1 坐标轴的创建&#xff08;上篇&#xff09; 4.1.1 D3 中的边距约定&#xff08;中篇&#xff09;4.1.2 坐标轴的生成&#xff08;中篇&#xff09; 4.1.2.1 比例尺的声明&#xff08;中篇&#xff09;4.1…

美国大选——极具典型的可视化案例!GISer学起来

有人说可视化技术有啥意义&#xff0c;不就做个大屏么&#xff1f; 那真的小看了&#xff0c;就如下图这个美国大选来看&#xff0c;这么复杂混乱的信息&#xff0c;可视化技术给你梳理的明明白白的&#xff0c;简单、直观、形象、便于记忆。 让用户能够从繁杂信息中快速抓到重…