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

C高级编程 第十六天(树 二叉树)

1.树

1.1结构特点

  • 非线性结构,有一个直接前驱,但可能有多个直接后继
  • 有递归性,树中还有树
  • 可以为空,即节点个数为零

1.2相关术语

  • 根:即根结点,没有前驱
  • 叶子:即终端结点,没有后继
  • 森林:即树的集合
  • 结点的度:直接后继的个数
  • 树的度:结点的度的最大值
  • 树的深度高度:结点的最大层数

1.3树的表示法

1.3.1图形表示法

1.3.2广义表表示法

1.3.3左孩子右兄弟表示法

将一颗多插树转化为二叉树,如下

其中,结点结构为

左结点为孩子结点,右节点为兄弟结点

2.二叉树

2.1定义

一个根节点和两棵不相交的二叉树组成,即1:2

2.2基本特征

每个节点最多有两棵子树——每个节点的度<=2

左子树和右子树的顺序不能颠倒——有序树

2.3二叉树性质

满二叉树:深度为k,有2^k-1个节点

完全二叉树:除最后一层,每一层节点数达到最大值,在最后一层只缺右边的若干节点

2.4二叉树的遍历

//单个结点
struct BinaryNode
{char ch;struct BinaryNode* lChild;struct BinaryNode* rChild;
};
void test()
{struct BinaryNode A = { 'A',NULL,NULL };struct BinaryNode B = { 'B',NULL,NULL };struct BinaryNode C = { 'C',NULL,NULL };struct BinaryNode D = { 'D',NULL,NULL };struct BinaryNode E = { 'E',NULL,NULL };struct BinaryNode F = { 'F',NULL,NULL };struct BinaryNode G = { 'G',NULL,NULL };struct BinaryNode H = { 'H',NULL,NULL };//创建节点之间的关系A.lChild = &B;A.rChild = &F;B.rChild = &C;C.lChild = &D;C.rChild = &E;F.rChild = &G;G.lChild = &H;//先序遍历printf("先序遍历\n");PreorderTraversal(&A);printf("中序遍历\n");InorderTraversal(&A);printf("后序遍历\n");PostorderTraversal(&A);
}

先序遍历:DLR

//DLR
void PreorderTraversal(struct BinaryNode* node)
{if (node == NULL){return NULL;}printf("%c\n",node->ch);PreorderTraversal(node->lChild);PreorderTraversal(node->rChild);
}

中序遍历:LDR

//LDR
void InorderTraversal(struct BinaryNode* node)
{if (node == NULL){return NULL;}InorderTraversal(node->lChild);printf("%c\n", node->ch);InorderTraversal(node->rChild);
}

后序遍历:LRD

//LRD
void PostorderTraversal(struct BinaryNode* node)
{if (node == NULL){return NULL;}PostorderTraversal(node->lChild);PostorderTraversal(node->rChild);printf("%c\n", node->ch);
}

2.5统计二叉树的叶子数量

左孩子和右孩子都为空指针时,即为叶子结点

//统计叶子数量
void calculateLeadNum(struct BinaryNode* root, int* p)
{if (root == NULL){return NULL;}if (root->lChild == NULL && root->rChild == NULL){(*p)++;}calculateLeadNum(root->lChild, p);calculateLeadNum(root->rChild, p);
}

2.6统计二叉树的高度

比较左子树和右子树的高度,取最大的一个加一,即为树的高度

//计算树的高度
int calculateHeight(struct BinaryNode* root)
{if (root == NULL){return NULL;}int lp = calculateHeight(root->lChild);int rp = calculateHeight(root->rChild);int height = lp > rp ? lp + 1 : rp + 1;return height;
}

2.7拷贝二叉树

  • 拷贝左子树
  • 拷贝右子树
  • 创建新节点
  • 将拷贝的左子树和右子树挂载到新节点上
  • 将新节点赋值
//拷贝二叉树
struct BinaryNode* copyTree(struct BinaryNode* root)
{if (root == NULL){return NULL;}struct BinaryNode* lp=copyTree(root->lChild);struct BinaryNode* rp=copyTree(root->rChild);struct BinaryNode* newNode = malloc(sizeof(struct BinaryNode));if (newNode == NULL){return;}newNode->lChild = lp;newNode->rChild = rp;newNode->ch = root->ch;return newNode;
}

2.8释放二叉树

  • 释放左子树
  • 释放右子树
  • 释放根节点
//释放二叉树
void releaseTree(struct BinaryNode* root)
{if (root == NULL){return NULL;}releaseTree(root->lChild);releaseTree(root->rChild);printf("%c结点已被释放", root->ch);releaseTree(root);
}

2.9二叉树的非递归遍历

将每个节点设一个标志,默认false

(1)将根节点压入栈中

(2)进入循环(只要栈中元素个数大于0,进行循环操作)

  • 弹出栈顶元素
  • 若栈顶元素标志为true,输出此元素并执行下一次循环
  • 若栈顶元素标志为false,将节点标志设为true
  • 将该节点的右子树、左子树、根压入栈中
  • 执行下一次循环

相关文章:

C高级编程 第十六天(树 二叉树)

1.树 1.1结构特点 非线性结构&#xff0c;有一个直接前驱&#xff0c;但可能有多个直接后继有递归性&#xff0c;树中还有树可以为空&#xff0c;即节点个数为零 1.2相关术语 根&#xff1a;即根结点&#xff0c;没有前驱叶子&#xff1a;即终端结点&#xff0c;没有后继森…...

OpenCV结构分析与形状描述符(11)椭圆拟合函数fitEllipse()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆&#xff0c;该椭圆在最小二乘意义上最好地拟合一组2D点。它返回一个内切椭圆的旋转矩形。使…...

904.水果成篮

题目 链接&#xff1a;leetcode链接 思路分析&#xff08;滑动窗口&#xff09; 读完题目&#xff0c;很明显&#xff0c;这个题目需要我们寻找一个最长子数组&#xff0c;使得这个子数组里面最多存在两种不同的数字&#xff0c;很容易联想到使用滑动窗口。 另外&#xff…...

【网络安全】漏洞挖掘之 2FA 恢复代码安全措施不当

未经许可,不得转载。 文章目录 正文正文 目标:example.com 2024年6月,我在HackerOne上参与一个私人项目时发现了一个与2FA(双因素身份验证)恢复代码管理相关的安全漏洞。该漏洞发生在用户禁用并重新启用2FA的过程中。问题在于,系统在2FA重新启用后,仍然接受此前生成的…...

指令微调与参数微调的代码实践与分析

文章目录 指令微调的实验性分析LoRA 代码实践与分析指令微调的示例代码与预训练的代码高度一致,区别主要在于指令微调数据集的构建(SFTDataset)和序列到序列损失的计算(DataCollatorForSupervisedDataset)。以下代码展示了 LLMBox 和 YuLan-Chat 中指令微调的整体训练流程…...

Android14音频进阶之高通Elite架构指定通道播放(八十四)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+…...

常见的正则化方法以及L1,L2正则化的简单描述

深度学习中的正则化是通过在模型训练过程中引入某些技术来防止模型过拟合的一种策略。过拟合是指模型在训练数据上表现非常好&#xff0c;但在新的、未见过的数据上表现不佳。正则化通过限制模型的复杂度或对模型参数施加约束&#xff0c;从而提高模型的泛化能力。 常见的正则…...

深入理解 Milvus:新一代向量数据库的基础技术与实战指南

一、什么是 Milvus&#xff1f; Milvus 是一个开源的向量数据库&#xff0c;专门设计用于存储和检索大规模的高维向量数据。无论是图像、视频、音频还是文本&#xff0c;通过将这些数据转换为向量&#xff0c;Milvus 都能通过近似最近邻搜索&#xff08;Approximate Nearest N…...

Maven教程——从入门到入坑

第1章 为什么要使用Maven 1.1 获取第三方jar包   开发中需要使用到的jar包种类繁多&#xff0c;获取jar包的方式都不尽相同。为了查找一个jar包找遍互联网&#xff0c;身心俱疲。不仅如此&#xff0c;费劲心血找到的jar包里有的时候并没有你需要的那个类&#xff0c;又或者有…...

研究生深度学习入门的十天学习计划------第九天

第9天&#xff1a;深度学习中的迁移学习与模型微调 目标&#xff1a; 理解迁移学习的核心概念&#xff0c;学习如何在实际应用中对预训练模型进行迁移和微调&#xff0c;以应对不同领域的任务。 9.1 什么是迁移学习&#xff1f; 迁移学习&#xff08;Transfer Learning&#…...

perl的学习记录——仿真regression

1 记录的背景 之前只知道有这个强大语言的存在&#xff0c;但一直侥幸自己应该不会用到它&#xff0c;所以一直没有开始学习。然而人生这么长&#xff0c;怎就确定自己不会用到呢&#xff1f; 这次要搭建一个可以自动跑完所有case并且打印每个case的pass信息到指定的文件中。…...

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么 &#x1f3b5; 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time&q…...

Emlog-Pro访问网站时需要密码验证插件

插件介绍 EmlogPro访问网站密码验证插件&#xff0c;为你的网站添加输入密码访问网站功能&#xff0c;在应用中的场景往往运用在为内部或是个人使用的页面里面&#xff0c;在访问的时候可以提示输入密码&#xff0c;做隐私保护。 下载地址&#xff1a; Emlog-Pro访问网站时需…...

Apache ShardingSphere数据分片弹性伸缩加解密中间件

Apache ShardingSphere Apache ShardingSphere 是一款分布式 SQL 事务和查询引擎,可通过数据分片、弹性伸缩、加密等能力对任意数据库进行增强。 软件背景 ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding…...

Django+Vue家居全屋定制系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 需要的环境3.2 Django接口层3.3 实体类3.4 config.ini3.5 启动类3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质创作者&…...

如何把自动获取的ip地址固定

在大多数网络环境中&#xff0c;‌设备通常会自动从DHCP服务器获取IP地址。‌这种动态分配IP的方式虽然灵活方便&#xff0c;‌但在某些特定场景下&#xff0c;‌我们可能需要将设备的IP地址固定下来&#xff0c;‌以确保网络连接的稳定性和可访问性。‌本文将详细介绍如何把自…...

Java应用的数据库死锁问题分析与解决

Java应用的数据库死锁问题分析与解决 大家好&#xff0c;我是微赚淘客返利系统3.0的小编&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 数据库死锁是多线程环境中常见的问题&#xff0c;尤其是在复杂的事务处理和数据访问中。死锁发生时&#x…...

ImportError: cannot import name ‘DglNodePropPredDataset‘ from ‘ogb.nodepropp

ImportError: cannot import name DglNodePropPredDataset from ogb.nodepropp 问题&#xff1a; 在跑深度学习时引入这个模块一直报错不能引入&#xff0c; 但看环境相关的包都安装好了&#xff0c;就是读取不到&#xff0c;时间还白白浪费。 解决办法 from ogb.nodeproppr…...

基于SSM(Spring、SpringMVC、MyBatis)框架的高校信息管理系统

基于SSM&#xff08;Spring、SpringMVC、MyBatis&#xff09;框架的高校信息管理系统是一个典型的Java Web应用开发项目。这类系统通常需要处理大量的学生、教师及课程信息&#xff0c;并提供相应的管理功能。下面是一个简化的设计方案&#xff0c;旨在帮助你理解如何构建这样的…...

C++第一节入门

一、历史 C是在C上继承拓展的&#xff01; java是一家公司&#xff08;甲骨文&#xff09;借鉴C生成的&#xff01; C#是微软借鉴java生成的&#xff01; 二、命名空间 当我们定义一个名叫rand的变量&#xff0c;但是由于stdlib头文件里面有个函数跟rand重名&#xff01;因此…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...