C++学习笔记——用C++实现树(区别于C)

news2024/11/16 17:45:17

树是一种非常重要的数据结构,它在计算机科学中的应用非常广泛。在本篇博客中,我们将介绍树的基本概念和C++中如何实现树。

目录

一、树的基本概念

2.C++中实现树

2.1创建一个树的实例,并向其添加节点

2.2三种遍历方式的实现代码

3.与C语言相比

3.1C++与C语言的一些不同之处

面向对象编程

标准库

异常处理

模板

命名空间

引用类型

类型安全性

强制类型转换

3.2一个简单的示例代码

C语言代码

C++代码


上一篇文章:

包含六大组件,它们分别是:

容器(Containers):提供了数据存储的功能。有vector、list、map等常用容器。

算法(Algorithms):提供了大量的算法,包括排序、查找、拷贝、合并等。有sort、find、copy、merge等常用算法。

迭代器(Iterators):提供了一种访问容器元素的方式,可以对容器进行遍历。有输入迭代器、输出迭代器、正向迭代器、双向迭代器、随机访问迭代器等类型。

函数对象(Function Objects):封装了一个函数或者函数指针,可以像使用函数一样使用它。有unary_function、binary_function等类型。

适配器(Adapters):将一种容器或者迭代器转换为另一种容器或者迭代器。有stack、queue、priority_queue、reverse_iterator等类型。

分配器(Allocators):管理内存分配和释放,可以自定义分配器来满足特定需求。有allocator等类型。

C++学习笔记——SLT六大组件及头文件-CSDN博客文章浏览阅读162次,点赞4次,收藏6次。GNU通用公共许可证(GNU General Public License,GPL):GPL是GNU项目下的主要许可证,它保护了软件的自由性,确保用户在任何使用、修改和分发软件时都能保持相同的自由。自由软件(Free Software):根据GNU的定义,自由软件是指用户可以自由地运行、复制、分发、研究、修改和改进的软件。GNU源代码开发精神的目标是让用户能够控制和定制自己使用的软件,避免对专有软件的依赖和束缚。算法(Algorithms):提供了大量的算法,包括排序、查找、拷贝、合并等。https://blog.csdn.net/m0_62338174/article/details/135581450?spm=1001.2014.3001.5501

一、树的基本概念

在计算机科学中,树是一种非常重要的数据结构,它由一组节点和连接这些节点的边组成。树的一个节点称为根节点,它没有父节点;除了根节点外,每个节点都有且只有一个父节点。同时,每个节点可以有任意多个子节点。如果一个节点没有子节点,则称为叶子节点。

树具有以下特点:

  • 每个节点最多只有一个父节点。
  • 每个节点可以有任意多个子节点。
  • 每个节点都有唯一的路径从根节点到达。
  • 除了根节点外,每个节点都有唯一的路径到达。

由于树的这些特点,它被广泛应用于各种场景,例如文件系统、网站导航、数据结构中的二叉树等。

2.C++中实现树

在C++中,我们可以使用类来表示树。树的每个节点可以使用一个包含指向其父节点和子节点的指针的结构体或类来表示。下面是一个示例代码:

class Node {
public:
    int data; // 节点存储的数据
    Node* parent; // 指向父节点的指针
    std::vector<Node*> children; // 子节点的指针数组

    Node(int data) {
        this->data = data;
        this->parent = nullptr;
        this->children = std::vector<Node*>();
    }
};

在上面的代码中,我们定义了一个名为Node的类,它具有以下成员变量:

  • data:节点存储的数据。
  • parent:指向父节点的指针。如果当前节点是根节点,则该指针为nullptr
  • children:子节点的指针数组。

2.1创建一个树的实例,并向其添加节点

下面是一个示例代码:

int main() {
    // 创建根节点
    Node* root = new Node(1);

    // 添加子节点
    Node* node2 = new Node(2);
    root->children.push_back(node2);
    node2->parent = root;

    Node* node3 = new Node(3);
    root->children.push_back(node3);
    node3->parent = root;

    Node* node4 = new Node(4);
    node2->children.push_back(node4);
    node4->parent = node2;

    // 遍历树
    std::cout << "Preorder Traversal: ";
    preorder(root);
    std::cout << std::endl;

    std::cout << "Postorder Traversal: ";
    postorder(root);
    std::cout << std::endl;

    std::cout << "Inorder Traversal: ";
    inorder(root);
    std::cout << std::endl;

    return 0;
}

在上述代码中,我们首先创建了一个根节点,并向其添加了三个子节点,其中node2node3是根节点的直接子节点,而node4node2的子节点。然后,我们使用三种不同的方式遍历树:前序遍历、后序遍历和中序遍历。

2.2三种遍历方式的实现代码

  • // 前序遍历
    void preorder(Node* node) {
        if (node == nullptr) return;
        std::cout << node->data << " ";
        for (Node* child : node->children) {
            preorder(child);
        }
    }
    
    // 后序遍历
    void postorder(Node* node) {
        if (node == nullptr) return;
        for (Node* child : node->children) {
            postorder(child);
        }
        std::cout << node->data << " ";
    }
    
    // 中序遍历
    void inorder(Node* node) {
        if (node == nullptr) return;
        if (node->children.size() >= 1) {
            inorder(node->children[0]);
        }
        std::cout << node->data << " ";
        for (int i = 1; i < node->children.size(); i++) {
            inorder(node->children[i]);
        }
    }
    

在上述代码中,我们使用递归方式遍历树的所有节点,并将它们的值输出到控制台上。

树是一种非常重要的数据结构,它在计算机科学中应用非常广泛。在C++中,我们可以使用类来表示树,并通过递归遍历方式来访问树的所有节点。

3.与C语言相比

C++是一种更加现代化和功能强大的编程语言,它在C语言的基础上进行了扩展和改进。以下是

3.1C++与C语言的一些不同之处

面向对象编程

C++支持面向对象编程(OOP),可以使用类、对象、继承、多态等概念来组织和管理代码。而C语言是过程式编程语言,没有内置的面向对象特性。

标准库

C++提供了丰富的标准库,例如容器(如vector、list、map)、算法(如排序、查找)、字符串处理、输入输出等。这些库提供了许多高级和方便的功能,可以加速开发过程。C语言的标准库相对较小,功能相对有限。

异常处理

C++引入了异常处理机制,可以在程序中捕获和处理异常情况,从而增加代码的健壮性和可靠性。C语言没有内置的异常处理机制。

模板

C++支持泛型编程,通过模板可以实现通用的数据结构和算法。模板可以在编译时进行类型检查和实例化,使得代码更加灵活和可重用。C语言没有模板这样的特性。

命名空间

C++引入了命名空间的概念,可以将代码组织为不同的命名空间,避免命名冲突和重复。C语言没有命名空间的概念。

引用类型

C++引入了引用类型,可以创建引用变量,它们相当于别名,可以方便地操作和修改变量的值。C语言没有引用类型。

类型安全性

C++在类型检查方面更为严格,通过静态类型检查来捕获潜在的类型错误,减少运行时错误的可能性。C语言对类型的检查较为宽松。

强制类型转换

C++提供了四种强制类型转换运算符(static_cast、dynamic_cast、reinterpret_cast、const_cast),可以在类型之间进行显式的转换。C语言只有隐式和显式的类型转换。

需要注意的是,尽管C++具有上述扩展和改进,但它仍然兼容C语言的语法和大部分特性,可以直接使用C代码,并且C++代码也可以通过使用extern "C"来与C代码进行互操作。

3.2一个简单的示例代码

展示了C语言和C++语言之间的一些不同之处:

C语言代码

#include <stdio.h>

// 函数原型可以省略参数列表
int add();

int main() {
    printf("%d\n", add(3, 5)); // 在函数调用时不进行参数类型检查
    return 0;
}

// 函数定义需要在函数原型之后
int add(int a, int b) {
    return a + b;
}

C++代码

#include <iostream>

// 函数原型必须包含参数列表
int add(int a, int b); 

int main() {
    std::cout << add(3, 5) << std::endl; // 在函数调用时要求参数类型匹配
    return 0;
}

// 函数定义可以在函数原型之前或之后
int add(int a, int b) {
    return a + b;
}

在上述代码中,可以看到以下不同之处:

  1. C语言中的头文件使用#include <stdio.h>,而C++中的头文件使用#include <iostream>

  2. C语言中的函数原型可以省略参数列表,而C++中的函数原型必须包含参数列表。

  3. 在C语言中,函数的定义可以在函数原型之前或之后,而在C++中,函数的定义可以在函数原型之前或之后。

  4. C语言使用printf函数来输出结果,而C++使用std::cout对象和<<操作符进行输出。

  5. 在C语言中,函数调用时不进行参数类型检查,而在C++中要求函数调用时参数类型要匹配。

这些是C语言和C++语言之间的一些基本区别,其中还有更多的差异,包括面向对象编程、异常处理、命名空间等特性。

 

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

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

相关文章

以前获得的一枚勋章

以前我上大学期间&#xff0c;每周都去合肥南七里买一份广州出版的《足球报》。

数据结构排序二叉树(下)

哎,调了几天深度学习模型,今天来更新排序二叉树 文章目录 前言 一、排序二叉树的结构定义 二、在排序二叉树添加数据 三、定义创建排序二叉树函数 四、查找一棵二叉排序树中的结点x的所在层数 五、删除二叉排序树中T关键字x的节点 六、查找二叉排序树中的所有小于key的关…

QT上位机开发(动画效果)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 不管是仿真&#xff0c;还是对真实环境的一比一模拟&#xff0c;动画都是非常好的一种呈现方式。目前在qt上面&#xff0c;实现动画主要有两种方法…

Github项目推荐--MusicFreeDesktop

项目地址 https://github.com/maotoumao/MusicFreeDesktop 项目简述 这是一个开源的音乐播放器&#xff0c;主要使用typescript编写&#xff0c;页面很漂亮。支持自定义主题和插件化配置音源&#xff0c;是一大亮点。 项目截图

【论文阅读】Latent Consistency Models (LDMs)、LCM-LoRa

文章目录 IntroductionPreliminariesDiffusion ModelsConsistency Models Latent Consistency ModelsConsistency Distillation in the Latent SpaceOne-Stage Guided Distillation by Solving Augmented PF-ODEAccelerating Distillation with Skipping Time StepsLatent Cons…

Rust-数组

数组是一个容器&#xff0c;它在一块连续空间内存中&#xff0c;存储了一系列的同样类型的数据。 数组中元素的占用空间大小必须是编译期确定的。 数组本身所容纳的元素个数也必须是编译期确定的&#xff0c;执行阶段不可变。 如果需要使用变长的容器&#xff0c;可以使用标…

如何使用程序控制微信发送消息

简介 使用杨中科老师的nuget包NetAutoGUI&#xff0c;控制微信给指定用户发送消息&#xff0c;如果想下面视频一样使用此功能用来轰炸朋友&#xff0c;可以直接跳到最后一节&#xff0c;或者直接下载我的打包好的程序集 【免费】控制微信发送消息的程序资源-CSDN文库 微信轰炸…

复合机器人作为一种新型的智能制造装备高效、精准和灵活的生产方式

随着汽车制造业的快速发展&#xff0c;对于高效、精准和灵活的生产方式需求日益增强。复合机器人作为一种新型的智能制造装备&#xff0c;以其独特的优势在汽车制造中发挥着越来越重要的作用。因此&#xff0c;富唯智能顺应时代的发展趋势&#xff0c;研发出了ICR系列的复合机器…

定岗定编:国有电力企业精细化管理改革方案

某发电厂作为神华国华集团下属单位&#xff0c;位于环渤海地区&#xff0c;成立于20世纪90年代&#xff0c;是国家“八五”、“九五”期间重点电力建设项目。在建立之初&#xff0c;公司引入了两台800MW超临界燃煤机组&#xff0c;总投资超过100亿元&#xff0c;近年开展了二期…

RTSP协议实现发送ACC音频数据

一.AAC音频格式介绍 AAC音频格式&#xff1a;Advanced Audio Coding&#xff08;高级音频解码&#xff09;&#xff0c;是一种由MPEG—4标准定义的有损音频压缩格式。音频压缩编码的输出码流&#xff0c;以音频帧的形式存在。每个音频帧包含若干个音频采样的压缩数据&#xff0…

Butler for Mac 菜单栏快速启动工具

Butler介绍 Butler for Mac版是一款Mac菜单栏快速启动工具&#xff0c;主要用于加速您的工作流程并简化您的日常任务。 借助Butler的帮助&#xff0c;您可以控制iTunes&#xff0c;启动应用程序&#xff0c;打开文件和文档&#xff0c;在用户之间切换&#xff0c;搜索网络等等…

鸿蒙Harmony-列表组件(List)详解

不要和别人比生活&#xff0c;每个人阶段不同&#xff0c;追求不同&#xff0c;活法自然也不同。只要今天的你能比昨天的你快乐一点点&#xff0c;那你就是自己人生赢家。 目录 一&#xff0c;定义 二&#xff0c;布局与约束 2.1 布局 2.2 约束 三&#xff0c;开发布局 3.1 设置…

基于Python的汽车信息爬取与可视化分析系统

介绍 这款汽车信息网站是基于多项技术和框架设计的全面的汽车信息展示及查询系统。其中&#xff0c;采用了Python Django框架和Scrapy爬虫技术实现数据的抓取和处理&#xff0c;结合MySQL数据库进行数据存储和管理&#xff0c;利用Vue3、Element-Plus、ECharts以及Pinia等前端…

【大数据】Flink 详解(九):SQL 篇 Ⅱ

《Flink 详解》系列&#xff08;已完结&#xff09;&#xff0c;共包含以下 10 10 10 篇文章&#xff1a; 【大数据】Flink 详解&#xff08;一&#xff09;&#xff1a;基础篇【大数据】Flink 详解&#xff08;二&#xff09;&#xff1a;核心篇 Ⅰ【大数据】Flink 详解&…

Codeforces Round 920 (Div. 3)

Codeforces Round 920 (Div. 3) Codeforces Round 920 (Div. 3) A. Square 题意&#xff1a;随机给出正方形在平面坐标系上的四个顶点的坐标&#xff0c;求正方形的面积&#xff0c;正方形边与xy轴平行。 思路&#xff1a;因为正方形与坐标轴平行&#xff0c;所以找出相同的…

React Native 原生组件回调JS层方法和 JS 层调用原生组件的事件方法

一、原生组件回调 JS 层提供的事件方法 比如 TextInput 组件 onChangeText 属性&#xff0c;输入事件是发生在原生层的但是需要通知 JS 层发生了变化&#xff0c;并执行 JS 层的方法。 1、给原生组件添加一个按钮用于触发原生事件方法 在 XML 中添加一个按钮 为了方便让 Inf…

已解决:g++: error: unrecognized command line option ‘-Wnull-dereference‘

VS运行正常的c代码&#xff0c;出现错误&#xff1a; 正在执行任务: C:/Windows/System32/cmd.exe /d /c g -Wall -Wextra -Wpedantic -Wshadow -Wformat2 -Wcast-align -Wconversion -Wsign-conversion -Wnull-dereference -g3 -O0 -c e:\Desktop\C\hdu\1000.cpp -o .\build\…

保姆级ESP-IDF开发环境搭建

1. 手动安装工具链&#xff0c;命令行方式&#xff08;windows&#xff09; 1.1 下载离线安装器 进入乐鑫 ESP-IDF Windows Installer Download 下载页面&#xff0c;选择离线版本工具&#xff08;网络原因&#xff0c;安装过程中使用github下载会出问题&#xff09;。 1.2 使…

unity C#中使用ref、out区别和使用案例

文章目录 ref 关键字out 关键字 在Unity&#xff08;以及C#编程语言中&#xff09;&#xff0c; ref 和 out 都是用来传递参数的引用&#xff0c;这意味着它们允许函数修改实参变量&#xff0c;并且这些修改会反映到调用函数的地方。但它们之间确实存在一些关键区别和使用场景…

Flutter开发进阶之并发操作数据库

Flutter开发进阶之并发操作数据库 尽管 Flutter 本身不包含任何数据库功能&#xff0c;但可以使用各种第三方库和插件来在 Flutter 应用程序中实现数据库功能&#xff1b; 以下将使用sqflite作为例子&#xff0c;sqflite允许在 Flutter 应用程序中执行 SQL 查询&#xff0c;创…