数据结构第十三弹---链式二叉树基本操作(上)

链式二叉树

  • 1、结构定义
  • 2、手动创建二叉树
  • 3、前序遍历
  • 4、中序遍历
  • 5、后序遍历
  • 6、层序遍历
  • 7、计算结点个数
  • 8、计算叶子结点个数
  • 9、计算第K层结点个数
  • 10、计算树的最大深度
  • 总结

1、结构定义

实现一个数据结构少不了数据的定义,所以第一步需要定义二叉树的机构。

typedef char BTDataType;//定义数据类型,可以根据需要更改typedef struct BinaryTreeNode
{struct BinaryTreeNode* left;//左指针struct BinaryTreeNode* right;//右指针BTDataType data;//存储数据
}BTNode;

2、手动创建二叉树

初次学习链式二叉树,对于创建一个二叉树较难理解,所以先手动创建二叉树,学习一些操作之后再来通过函数实现链式二叉树。

//创建结点函数
BTNode* BuyTree(BTDataType x)
{BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));newnode->data = x;newnode->left = NULL;newnode->right = NULL;return newnode;
}
//创建结点BTNode* A = BuyTree('A');BTNode* B = BuyTree('B');BTNode* C = BuyTree('C');BTNode* D = BuyTree('D');BTNode* E = BuyTree('E');BTNode* F = BuyTree('F');
//链接结点A->left = B;A->right = E;B->left = C;B->right = D;E->left = F;

在这里插入图片描述

3、前序遍历

前序遍历,又称先根遍历。
遍历顺序:根,左子树,右子树。

代码实现

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

此处实现的遍历版本是将空指针也打印出来的版本,更适合新手理解
测试
在这里插入图片描述

4、中序遍历

中序遍历,又称中根遍历。
遍历顺序:左子树,根,右子树。

代码实现

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

测试
在这里插入图片描述

5、后序遍历

后序遍历,又称后根遍历。
遍历顺序:左子树,右子树,根。

代码实现

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

测试
在这里插入图片描述

6、层序遍历

层序遍历,自上到下,自左到右依次访问数的结点就是层序遍历。

思想(借助一个队列):
1、先将根节点入队,然后开始从队头出数据
2、出队头的数据同时将队头左右子树的结点入队(遇到NULL则不入队)
3、重复第二步,直到队列为空

在这里插入图片描述
代码实现

void LevelOrder(BTNode* root)
{Queue q;//创建爱你队列QueueInit(&q);//初始化队列if (root)//根节点不为空则入队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);//销毁队列
}

测试
在这里插入图片描述

7、计算结点个数

计算结点个数时,可以将问题拆成子问题
1、为空时,结点个数为0
2、不为空时,结点个数=左子树结点个数+右子树结点个数+1(根节点)

代码实现

int TreeSize(BTNode* root)
{return root==NULL?0:TreeSize(root->left) + TreeSize(root->right) + 1;
}

测试
在这里插入图片描述

8、计算叶子结点个数

计算叶子结点个数时,可以将问题拆成子问题
1、为空时,叶子结点个数为0
2、结点左右孩子为空时,叶子结点个数为1
3、结点不为空,叶子结点个数=左子树叶子结点个数+右子树叶子结点个数

代码实现

int TreeLeafSize(BTNode* root)
{if (root == NULL){return 0;}if (root->left == NULL && root->right==NULL){return 1;}return TreeLeafSize(root->left) + TreeLeafSize(root->right);
}

测试
在这里插入图片描述

9、计算第K层结点个数

计算第K层结点个数时,可以将问题拆分成子问题。
1、为空和非法时,结点个数为0个
2、为第一层时,结点个数为1个
3、不为空且合法时,第K层的结点个数=第K-1层的左子树结点个数+第K-1层的右子树结点个数

代码实现

//第k层结点的个数
int TreeKLevelSize(BTNode* root, int k)
{if (k < 1 || root == NULL)//空树或输入k值不合法return 0;if (k == 1)//第一层结点个数return 1;//不为空且合法时,第K层的结点个数=第K-1层的左子树结点个数+第K-1层的右子树结点个数return TreeKLevelSize(root->left, k - 1) + TreeKLevelSize(root->right, k - 1);
}

测试
在这里插入图片描述

10、计算树的最大深度

计算树的最大深度时,可以将问题拆成子问题
1、为空时,深度为0
2、不为空时,最大深度为左子树和右子树较大的深度+1(自己)

代码实现

int maxDepth(BTNode* root) {if (root == NULL)return 0;//为空,深度为0int leftDepth = maxDepth(root->left);//记录左子树最大深度int rightDepth = maxDepth(root->right);//记录右子树最大深度//不为空时,最大深度为左子树和右子树较大的深度+1(自己)return leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1;
}

测试
在这里插入图片描述

总结

本篇博客就结束啦,谢谢大家的观看,如果公主少年们有好的建议可以留言喔,谢谢大家啦!

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

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

相关文章

学习笔记-mysql基础(DDL,DML,DQL)

一.DDL DDL,Data Definition Language,数据库定义语言,该语言包括以下内容: 对数据库的常用操作对表结构的常用操作修改表结构 1.对数据库的常用操作 -- 查看所有的数据库 show databases -- 创建数据库 create database [if not exists] test [charsetutf8] -- 切换 选择 …

记录汇川:H5U与Factory IO测试12

主程序&#xff1a; 子程序&#xff1a; IO映射 子程序&#xff1a; 辅助出料 子程序&#xff1a; 自动程序 Factory IO配置&#xff1a; 实际动作如下&#xff1a; Factory IO测试12

基于SSM的仓库在线管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

20-链表-删除链表中的节点

这是链表的第20题&#xff0c;力扣链接。 有一个单链表的 head&#xff0c;我们想删除它其中的一个节点 node。 给你一个需要删除的节点 node 。你将 无法访问 第一个节点 head。 链表的所有值都是 唯一的&#xff0c;并且保证给定的节点 node 不是链表中的最后一个节点。 删除…

支持向量机(公式推导+举例应用)

文章目录 引言间隔与支持向量机对偶问题&#xff08;拉格朗日乘子法&#xff09;SMO算法核函数软间隔与正则化软间隔正则化&#xff08;罚函数法&#xff09; 模型的稀疏性结论实验分析 引言 在机器学习领域&#xff0c;支持向量机&#xff08;Support Vector Machine&#xf…

蓝牙音视频远程控制协议(AVRCP) AV/C command格式介绍

零.声明 本专栏文章我们会以连载的方式持续更新&#xff0c;本专栏计划更新内容如下&#xff1a; 第一篇:蓝牙综合介绍 &#xff0c;主要介绍蓝牙的一些概念&#xff0c;产生背景&#xff0c;发展轨迹&#xff0c;市面蓝牙介绍&#xff0c;以及蓝牙开发板介绍。 第二篇:Trans…

生产数据不备份,用时两行泪

背景&#xff1a;项目使用pg一主一从&#xff0c;因慢sql导致查询慢&#xff0c;所以想从原本的4核加到16核&#xff0c;联系好运维后&#xff0c;打算先从从库开始操作&#xff0c;机器上的pgsql都正常关闭&#xff0c;然后停止&#xff0c;关机&#xff0c;扩容一切都很顺利&…

OpenCV-Python(34):FAST算法

目标 理解 FAST 算法的基础使用OpenCV 中的FAST 算法相关函数进行角点检测 介绍 FAST算法&#xff08;Features from Accelerated Segment Test&#xff09;是一种用于在图像中快速检测角点的算法。它是一种基于像素的检测方法&#xff0c;具有高效、准确的特点&#xff0c;常…

【算法分析与设计】最短路径和

题目&#xff1a; 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 示例&#xff1a; 示例 1&#xff1a; 输入&#xff1a;grid [[1,3,1],…

【PHP AES加解密示例】从入门到精通,一篇文章让你掌握加密解密技术!

一、引言 随着互联网的普及&#xff0c;数据安全问题越来越受到人们的关注。在众多加密算法中&#xff0c;AES&#xff08;Advanced Encryption Standard&#xff09;因其高效、安全的特点被广泛应用。本文将通过PHP语言&#xff0c;为大家展示一个简单的AES加解密示例&#x…

Retinal Structure Detection in OCTA Image viaVoting-Based Multitask Learning

一、摘要 研究背景&#xff1a;自动检测视网膜结构&#xff0c;如视网膜血管(RV)、中央凹血管区(FAZ)和视网膜血管连接(RVJ)&#xff0c;对了解眼部疾病和临床决策具有重要意义。 主要工作&#xff1a;在本文中&#xff0c;提出了一种新的基于投票的自适应特征融合多任务网络…

Pr模板(剪辑素材),Pr预设(视频转场,调色),Pr插件,Pr教程,Pr模板网

PR模板,免费Premiere模板下载网站.logo片头模板,标题字幕,样机相册,节奏快闪,开场预告,转场特效,图文照片,抖音自媒体Vlog短视频模板等Premiere项目工程源文件模板下载 Pr模板&#xff1a;https://prmuban.com/template PR预设,PR转场预设,PR调色预设,Pr剪辑视频特效PR预设.pr…

优化的实时换脸项目——DeepFaceLive

DeepFaceLive是一款基于人工智能技术的换脸工具&#xff0c;可以实现实时面部捕捉和换脸效果。它利用深度学习和计算机视觉算法&#xff0c;能够以惊人的准确度和速度将脸部特征无缝地映射到任何人的脸上。DeepFaceLive的特点是可以实时换脸&#xff0c;让用户通过网络摄像头应…

MySQL高可用解决方案演进:从主从复制到InnoDB Cluster架构

目录 前言 1. 主从复制 主从复制的基本配置示例&#xff1a; 2. 主从复制的限制 3. InnoDB Cluster架构 InnoDB Cluster配置步骤示例&#xff1a; 4. InnoDB Cluster的优势 总结 ⭐️ 好书推荐 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&…

京东年度数据报告-2023全年度游戏本十大热门品牌销量(销额)榜单

同笔记本市场类似&#xff0c;2023年度游戏本市场的整体销售也呈下滑态势。根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;京东平台上游戏本的年度销量累计超过350万&#xff0c;同比下滑约6%&#xff1b;销售额将近270亿&#xff0c;同比下滑约11%。 鲸参谋综合了京东…

C语言变量与函数

目录 变量函数 变量 变量&#xff1a;计算机里的一块内存空间int a 0; 表示定义一个整型 int 变量&#xff1b;这个变量名字叫做 a “” 表示赋值&#xff1b;即将右边的 0 赋值给左边的整型变量 a 现在这一块空间 a 存放了一个值 0 这个过程也叫做整型变量 a 的初始化初始化…

C++/WinRT 简介

C/WinRT 是 Windows 运行时 (WinRT) API 的完全标准新式 C17 语言投影&#xff0c;以基于标头文件的库的形式实现&#xff0c;旨在为你提供对新式 Windows API 的一流访问。 利用 C/WinRT&#xff0c;你可以采用任何符合标准的 C17 编译器创作和使用 Windows 运行时 API。 Wind…

OSG StatsHandler 初步学习

osg为视景器的使用和调试提供了丰富的辅助组件&#xff0c;它们主要是以osg::ViewerBase的成员变量或交互事件处理器(osgGA::GUIEventHandler)的形式出现。osgViewer::StatsHandler、osg::Stats类就是其中的两个经常用到的辅助组件。 #include<osgViewer/Viewer> #inclu…

iOS xcode 15.1 打包报错

真机调试的时候没问题&#xff0c;打包的时候报错了 #报错 解决办法 pods.xcodeproj - build phases - compile sources - compiler flags pods.xcodeproj - Targets-support files pods-xx-frameworks

GitHub Copilot的使用方法和快捷按键

GitHub Copilot是GitHub与OpenAI合作开发的一款人工智能编码助手。它基于GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型&#xff0c;可以为你提供代码补全、建议和生成的功能 使用方法&#xff1a; 安装插件&#xff1a; 首先&#xff0c;确保你的开发环…