当前位置: 首页 > news >正文

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

树是一种非常重要的数据结构,它在计算机科学中的应用非常广泛。在本篇博客中,我们将介绍树的基本概念和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++语言之间的一些基本区别,其中还有更多的差异,包括面向对象编程、异常处理、命名空间等特性。

 

相关文章:

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

树是一种非常重要的数据结构&#xff0c;它在计算机科学中的应用非常广泛。在本篇博客中&#xff0c;我们将介绍树的基本概念和C中如何实现树。 目录 一、树的基本概念 2.C中实现树 2.1创建一个树的实例&#xff0c;并向其添加节点 2.2三种遍历方式的实现代码 3.与C语言相…...

工业平板定制方案_基于联发科、紫光展锐平台的工业平板电脑方案

工业平板主板采用联发科MT6762平台方案&#xff0c;搭载Android 11.0操作系统&#xff0c; 主频最高2.0GHz&#xff0c;效能有大幅提升;采用12nm先进工艺&#xff0c;具有低功耗高性能的特点。 该工业平板主板搭载了IMG GE8320图形处理器&#xff0c;最高主频为680MHz, 支持108…...

JPA查询PostgreSQL行排序问题

文章目录 问题处理PostgreSQL排序相关JPA相关介绍 问题 我们项目使用Spring Boot构建&#xff0c;使用JHipster生成业务代码&#xff0c;包含基础的增删改查代码使用PostgreSQL作为业务数据库&#xff0c;使用自动生成的JPA构建数据更新语查询在查询某个实体类的列表时&#x…...

【css】渐变效果

css渐变效果 使用 CSS 渐变可以在两种颜色间制造出平滑的渐变效果。 用它代替图片&#xff0c;可以加快页面的载入时间、减小带宽占用。同时&#xff0c;因为渐变是由浏览器直接生成的&#xff0c;它在页面缩放时的效果比图片更好&#xff0c;因此你可以更加灵活、便捷的调整页…...

Maven 依赖传递和冲突、继承和聚合

一、依赖传递和冲突 1.1 Maven 依赖传递特性 1.1.1 概念 假如有三个 Maven 项目 A、B 和 C&#xff0c;其中项目 A 依赖 B&#xff0c;项目 B 依赖 C。那么我们可以说 A 依赖 C。也就是说&#xff0c;依赖的关系为&#xff1a;A—>B—>C&#xff0c; 那么我们执行项目 …...

Linux Centos7静默安装(非图形安装)Oracle RAC 11gR2(Oracle RAC 11.2.0.4)

Oracle RAC (全称Oracle Real Application Clusters &#xff09;静默安装&#xff08;非图形安装&#xff09;教程。 由于这篇文章花费了我太多时间&#xff0c;设置了仅粉丝可见&#xff0c;见谅。 环境说明&#xff1a; 虚拟机软件&#xff1a;VMware Workstation 16 Pro…...

集成开发环境(IDE)介绍

集成开发环境&#xff08;IDE&#xff09;介绍 集成开发环境&#xff08;Integrated Development Environment&#xff0c;IDE&#xff09;是一种软件应用程序&#xff0c;用于开发和编写软件。常见的IDE包括Eclipse、Visual Studio、IntelliJ IDEA、Qt Creator等。 集成开发环…...

基于物联网设计的智能储物柜(4G+华为云IOT+微信小程序)

一、项目介绍 在游乐场、商场、景区等人流量较大的地方&#xff0c;往往存在用户需要临时存放物品的情况&#xff0c;例如行李箱、外套、购物袋等。为了满足用户的储物需求&#xff0c;并提供更加便捷的服务体验&#xff0c;当前设计了一款物联网智能储物柜。 该智能储物柜通…...

12种常见的网络钓鱼

网络钓鱼是一种网络攻击&#xff0c;是指具有恶意动机的攻击者伪装欺骗人们并收集用户名或密码等敏感信息的一系列行为。由于网络钓鱼涉及心理操纵并依赖于人为失误(而不是硬件或软件漏洞)&#xff0c;因此被认定为是一种社会工程攻击。 1. 普通网络钓鱼&#xff08;群攻&…...

电商物流查询:未来的发展方向

在电商日益繁荣的时代&#xff0c;物流信息查询不仅关乎消费者体验&#xff0c;更影响着电商运营的效率。快速、准确地追踪物流信息至关重要。本文将简述物流信息快速追踪的价值&#xff0c;并重点介绍固乔快递查询助手这一高效查询工具及其批量查询功能。 一、物流信息快速追踪…...

【数据库原理】(25)数据完整性

一.完整性概述 数据库的完整性是保证数据正确性和一致性的关键。它防止数据库中存在不符合业务逻辑或语义规则的数据&#xff0c;避免错误信息的输入和输出。数据库的完整性和安全性不同&#xff0c;安全性关注的是防止非法用户的访问和恶意操作&#xff0c;而完整性则关注数据…...

逻辑运算符

逻辑运算符 什么是逻辑运算符&#xff1f; 在数学中&#xff0c;一个数据x大于5&#xff0c;小于15&#xff0c;我们可以这样来进行表示&#xff1a;5<x<15.在Java中&#xff0c;需要把上面的式子先进行拆解&#xff0c;再进行合并表达。 拆解为&#xff1a;x>5和 x…...

SpringBoot @RequestBody和@ResponseBody注解

1. RequestBody注解 用于将HTTP请求体的内容绑定到方法的参数上。通常情况下&#xff0c;我们使用这个注解来处理POST请求&#xff0c;特别是传递JSON格式的数据。 例&#xff1a; PostMapping("/user") public ResponseEntity<String> createUser(RequestB…...

实验四:静态路由配置

实验四&#xff1a;静态路由配置 1. 静态路由 ( 一般配置 ) 【实验名称】静态路由配置 【实验目的】掌握静态路由的配置方法&#xff0c;理解路由表的作用和原理 【实验设备】路由器&#xff08; 2 台&#xff09;、计算机&#xff08; 2 台&#xff09;、交叉线&#xf…...

UML-类图和类图转化为代码

提示&#xff1a;文章详细的讲解了类图的四种关系&#xff0c;以及每种关系如何转化为对应的代码。 UML-类图和类图转化为代码 一、类于类之间的关系1.依赖关系2.关联关系(1) 单向关联(2) 双向关联(3) 自关联(4) 聚合关联(has-a)(5) 组合关联&#xff08;contains-a&#xff09…...

数据科学与大数据导论期末复习笔记(大数据)

来自于深圳技术大学&#xff0c;此笔记涵盖了期末老师画的重点知识&#xff0c;分享给大家。 等深分箱和等宽分箱的区别&#xff1a;等宽分箱基于数据的范围来划分箱子&#xff0c;每个箱子的宽度相等。等深分箱基于数据的观测值数量来划分箱子&#xff0c;每个箱子包含相同数量…...

【保姆级教程|YOLOv8添加注意力机制】【2】在C2f结构中添加ShuffleAttention注意力机制并训练

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…...

Hive聚合函数详细讲解

Hive中的聚合函数用于在数据上进行计算并返回单个值,这些值通常是基于一组行或列的汇总。以下是您提到的聚合函数的详细讲解,包括案例和使用注意事项: SUM() 功能:计算某列的总和。语法:SUM(column)案例:SELECT SUM(salary) FROM employees;注意事项:通常用于数值型列。…...

方案:如何列出 Jira 中授予用户的所有权限

文章目录 概述解决方案REST API数据库 概述 为了进行故障排除或某些管理任务&#xff0c;我们可能想知道给定用户拥有的所有权限。 Jira 通过其 UI 提供权限助手和类似工具&#xff0c;但对于所有权限的列表&#xff0c;我们只能通过作为用户本身进行身份验证的 REST API 请求…...

Flutter-Web从0到部署上线(实践+埋坑)

本文字数&#xff1a;7743字 预计阅读时间&#xff1a;60分钟 01 前言 首先说明一下&#xff0c;这篇文章是给具备Flutter开发经验的客户端同学看的。Flutter 的诞生虽然来自 Google 的 Chrome 团队&#xff0c;但大家都知道 Flutter 最先支持的平台是 Android 和 iOS&#xff…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...