[C/C++]数据结构: 链式二叉树的构建及遍历

一: 💬二叉树的概念

1.1:🚩 概念

       二叉树是指树中节点的度不大于2的有序树,它是一种最简单且重要的树,二叉树的递归定义为:二叉树是一颗空树,或者是一颗由一个根节点和两颗互不相交的,分别称为跟的左孩子和右孩子树组成的非空树,其中左子树和右子树都是二叉树.

1.2 : ⚡特殊的二叉树

  1. 满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是 ,则它就是满二叉树。
  2.  完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。

1.3: 🌟二叉树的性质

  1. 若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有 2^(i-1)个结点.
  2. 若规定根节点的层数为1,则深度为h的二叉树的最大结点数是2^h-1 .
  3. 对任何一棵二叉树, 如果度为0其叶结点个数为 , 度为2的分支结点个数为 ,则有 n0=n2 +1
  4. 若规定根节点的层数为1,具有n个结点的满二叉树的深度,h=lg(n+1) (ps:是log以2为底,n+1为对数)
  5. 对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对于序号为i的结点有:

1. 若i>0,i位置节点的双亲序号:(i-1)/2;i=0,i为根节点编号,无双亲节点
2. 若2i+1<n,左孩子序号:2i+1,2i+1>=n否则无左孩子
3. 若2i+2<n,右孩子序号:2i+2,2i+2>=n否则无右孩子

二:🥦链式二叉树的结构

        二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 。由于二叉树可以分为根,左子树,右子树,而其左右子树又可以分为根左子树,右子树,所以链式二叉树非常适合使用递归. 

typedef char BTDataType;typedef struct BinaryTreeNode
{BTDataType data;struct BinaryTreeNode* left;struct BinaryTreeNode* right;
}BTNode;

三: ⛲链式二叉树的创建及遍历

1.前序遍历:先遍历树的根在遍历书的左子树和右子树

前序遍历递归图解:

代码:

void BinaryTreePrevOrder(BTNode* root)
{if (root == NULL){printf("NULL ");return;}printf("%c ", root->data);//先访问根节点BinaryTreePrevOrder(root->left);//访问左子树BinaryTreePrevOrder(root->right);//访问右子树
}

2.中序遍历:和前序遍历思想一样,不过遍历顺序发生改变,先便利左子树,再遍历根,再遍历右子树

void BinaryTreeInOrder(BTNode* root)
{if (root == NULL){printf("NULL ");return;}BinaryTreeInOrder(root->left);printf("%c ", root->data);BinaryTreeInOrder(root->right);
}

3.后序遍历:先遍历左子树再遍历右子树最后遍历根节点

void BinaryTreePostOrder(BTNode* root)
{if (root == NULL){printf("NULL ");return;}BinaryTreePostOrder(root->left);BinaryTreePostOrder(root->right);printf("%c ", root->data);
}

4.层序遍历:

        层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历.

实现方法: 层序遍历要使用到队列,忘记的帖子可以看[C/C++]数据结构 栈和队列

首先将节点1入队列

若1的左右节点不为空,再将左右节点依次入队,再把节点1出队(相当于遍历节点1)

重复上诉步骤,每次出队时先将这个节点不为空的子节点入队,当队列为空时就说明二叉树遍历完了

void BinaryTreeLevelOrder(BTNode* root)
{Queue q;QueueInit(&q);QueuePush(&q, root);while (!QueueEmpty(&q)){BTNode* front = QueueFront(&q);QueuePop(&q);printf("%c ", front->data);if (front->left)QueuePush(&q, front->left);if (front->right)QueuePush(&q, front->right);}QueueDestory(&q);
}

5.二叉树的构建

通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树,其中'#'代表NULL

还是采用递归的思想,首先函数的形参需要一个字符串数组,和一个整形指针,该指针是用来记录访问到数组的位置.遇到'#'就让改指针++,并返回NULL,否则就开辟一个节点,使该节点的数据域指向对应数组的元素,再递归遍历该节点的左子树和右子树

BTNode* BinaryTreeCreate(BTDataType* a, int* pi)
{if (a[*(pi)]=='#'){(*pi)++;return NULL;}BTNode* root = (BTNode*)malloc(sizeof(BTNode));if (root == NULL){perror("malloc");exit(-1);}root->data = a[(*pi)++];root->left  = BinaryTreeCreate(a, pi);root->right = BinaryTreeCreate(a, pi);return root;
}

四:其他相关功能

像求二叉树的节点个数,高度等功能都是利用递归思想解决的,博主就不过多介绍了,需要的帖子可以看下方代码

//节点个数
int BinaryTreeSize(BTNode* root)
{if (root == NULL)return 0;elsereturn 1 + BinaryTreeSize(root->left) + BinaryTreeSize(root->right);
}// 二叉树叶子节点个数
int BinaryTreeLeafSize(BTNode* root)
{if (root == NULL)return 0;else if (root->left == NULL && root->right == NULL)return 1;elsereturn BinaryTreeLeafSize(root->left) + BinaryTreeLeafSize(root->right);
}// 二叉树第k层节点个数
int BinaryTreeLevelKSize(BTNode* root, int k)
{assert(k >0);if(root==NULL)return 0;else if (k == 1)return 1;else{return BinaryTreeLevelKSize(root->left, k - 1) + BinaryTreeLevelKSize(root->right, k - 1);}}
//求二叉树的高度
int BinaryTreeHeight(BTNode* root)
{if (root == NULL)return 0;else{int left = BinaryTreeHeight(root->left);int right = BinaryTreeHeight(root->right);return left > right ? left+1 : right+1;}
}
//在二叉树中查找值为x的节点
BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{if (root == NULL)return NULL;if (root->data == x)return root;BTNode* ret1 = BinaryTreeFind(root->left, x);if (ret1 != NULL)return ret1;BTNode* ret2 = BinaryTreeFind(root->right, x);if (ret2 != NULL)return ret2;return NULL;
}
//销毁二叉树
void BinaryTreeDestory(BTNode* root)
{if (root == NULL)return;BinaryTreeDestory(root->left);BinaryTreeDestory(root->right);free(root);
}

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

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

相关文章

YOLOv5 目标计数 | 图片上绘制计数结果

修改方法: 只需要改 detect.py for path, im, im0s, vid_cap, s in dataset: 下新增一行 class_counts = {} class_counts[int(c)] = class_counts.get(int(c

《数字图像处理-OpenCV/Python》连载:图像的阈值处理

《数字图像处理-OpenCV/Python》连载&#xff1a;图像的阈值处理 本书京东 优惠购书链接 https://item.jd.com/14098452.html 本书CSDN 独家连载专栏 https://blog.csdn.net/youcans/category_12418787.html 第 9 章 图像的阈值处理 图像的阈值处理简单、直观&#xff0c;计算…

网络监测之如何保障企业业务系统安全?

网络信息安全在网络时代的重要性不言而喻。随着互联网的普及和数字化进程的加速&#xff0c;网络已经成为人们生活、工作和学习的重要平台。在这个平台上&#xff0c;信息交流、数据存储、在线支付等都需要依赖于网络信息安全。其中企事业单位业务系统安全值得关注。 企事业单…

水印消除:三种简单方法教你如何去除图片水印

当需要使用在线素材图片作为头像或壁纸时&#xff0c;水印可能成为不便之处。需要解决如何去除水印的问题吗&#xff1f;以下是几种方法供参考&#xff1a; 如何去除水印方法一&#xff1a;水印云去除水印&#xff08;适用于电脑端和手机端&#xff09; 水印云专注于无痕去水印…

给零基础朋友的编程课07 - 代码

给零基础朋友的编程课07-初识色彩、初识变量、案例3讲解_哔哩哔哩_bilibili Code: // // 案例3 // //// -设定画面- // size(1000, 1000); // 设置画面大小 background(7, 119, 132); // 设置背景颜色// - 绘画 - //// 1 绘制垂线 // 设定线条风格 …

第三十六周:文献阅读+注意力/自注意力机制

目录 摘要 Abstract 文献阅读&#xff1a;锂离子电池RUL预测的SA-LSTM 现有问题 提出方法 提出方法的结构 SA-LSTM预测模型的结构 研究实验 研究贡献 注意力机制 Self-Attention&#xff08;自注意力机制&#xff09; 注意力与自注意力 代码实现attention、self-at…

[Linux] MySQL数据库之索引

一、索引的相关知识 1.1 索引的简介 索引是一个排序列表&#xff0c;包含索引值和包含该值的数据行的物理地址&#xff08;类似于 c 语言链表&#xff0c;通过指针指向数据记录的内存地址&#xff09;。 使用索引后可以不用扫描全表来定位某行的数据&#xff0c;而是先通过索…

大模型做实体识别任务的原理

1、背景 命名实体识别&#xff08;named entity recognition&#xff0c;NER&#xff09;&#xff1a;通常是一个序列标注的任务&#xff0c;常见的模型框架有&#xff1a;LSTM-CRF、BERTBILSTMCRF等&#xff0c;该种任务通常被成为flat NER即&#xff1a;每一个token只分配一…

Python基础入门第六节课笔记

while循环 for循环用于针对序列中的每个元素的一个代码块。 while循环是不断的运行&#xff0c;直到指定的条件不满足为止。 while 条件&#xff1a; 条件成立重复执行的代码1 条件成立重复执行的代码2 …….. 当条件成立时&#xff0c;执行下方缩…

MongoDB查询文档

3.5 MongoDB 查询文档 MongoDB 查询文档使用 find() 方法。 find() 方法以非结构化的方式来显示所有文档。find()查询数据的语法格式如下&#xff1a; db.collection.find(query, projection)[.pretty()] query &#xff1a;可选&#xff0c;使用查询操作符指定查询条件 pr…

逻辑运算加法器

前言 逻辑门本质上操作的是单个二进制数&#xff0c;通过高低电压或者有无信号来表示&#xff0c;并且&#xff0c;因为二进制数的原因&#xff0c;一个数字&#xff0c;我们可以通过二进制数来表示&#xff0c;整数可以精确表示&#xff0c;浮点数可以近似表示 本篇文章使用逻…

信息系统定级与等级测评的具体过程

目录 信息系统安全定级流程图 信息系统定级的注意事项 补充内容 信息系统安全等级测评流程图 测评准备阶段 测评机构职责 被测单位职责 方案编制阶段 测评机构职责 被测单位职责 现场测评阶段 测评机构的职责 被测单位职责 分析与报告编制阶段 测评机构职责 被测…

fastadmin点击列表字段复制推广链接

fastadmin点击列表字段复制推广链接 要实现点击复制的功能需要引入外部js分享 利用clipboardjs实现复制功能 下载了之后需要引入外部js 1:把需要的js放在这个路径下 2.去require-frontend.js文件进行配置 3.在使用的js中引入外部js 实际调用

SpringCloudAlibaba Seata在Openfeign跨节点环境出现全局事务Xid失效原因底层探究

原创/朱季谦 曾经在SpringCloudAlibaba的Seata分布式事务搭建过程中&#xff0c;跨节点通过openfeign调用不同服务时&#xff0c;发现全局事务XID在当前节点也就是TM处&#xff0c;是正常能通过RootContext.getXID()获取到分布式全局事务XID的&#xff0c;但在下游节点就出现获…

【数据库系统概论】第3章-关系数据库标准语言SQL(3)

文章目录 3.5 数据更新3.5.1 插入数据3.5.2 修改数据3.5.3 删除数据 3.6 空值的处理3.7 视图3.7.1 建立视图3.7.2 查询视图3.7.3 更新视图3.7.4 视图的作用 3.5 数据更新 3.5.1 插入数据 注意&#xff1a;插入数据时要满足表或者列的约束条件&#xff0c;否则插入失败&#x…

《Nature》预测 2024 科技大事:GPT-5预计明年发布等

《Nature》杂志近日盘点了 2024 年值得关注的科学事件&#xff0c;包括 GPT-5 与新一代 AlphaFold、超算 Jupiter、探索月球任务、生产「超级蚊子」、朝向星辰大海、试验下一代新冠疫苗、照亮暗物质、意识之辩第二回合、应对气候变化。 今年以来&#xff0c;以 ChatGPT 为代表…

CentOS 7 用户必看SQLite 升级指南:轻松将旧版 3.7.17 升级至3.41.2详细教程

0.背景 编写此文是因为在 Linux 上跑项目时报错&#xff1a; sqlite3.NotSupportedError: deterministicTrue requires SQLite 3.8.3 or highe&#xff08;此时已经安装了 python3&#xff09;。sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) near "(&q…

新/旧版本 QT 下载,全攻略【省资源下载币专用】

看到好多朋友找不到指定版本的QT下载路径&#xff0c;特此更新一篇新/旧版本 QT 下载攻略 收藏一下吧&#xff0c;需要的时候方便查找&#xff0c;能为你省下好多资源下载币。 通过图示可以看出&#xff0c;新旧版本的界限并没有那么明晰&#xff0c;如果你需要的版本两个链接…

Podman配置mongodb

文章目录 查询镜像拉取镜像查看镜像运行容器创建root用户 查询镜像 podman search mongo拉取镜像 podman pull docker.io/library/mongo查看镜像 podman images运行容器 podman run -d -p 27017:27017 --namemongodb-test docker.io/library/mongo创建root用户 podman exe…

AI Earth平台简介

AI Earth地球科学云平台由达摩院-视觉技术实验室打造&#xff0c;基于地球科学智能计算分析方面的创新研究&#xff0c;致力于解决地球科学领域基础性、前沿性、业务性问题&#xff0c;目标成为国内一流的地球科学云计算平台。&#xff08;摘自官网&#xff09; 下面&#xff…