二叉树实现的相关函数
1.二叉树的创建
BTNode* BinaryTreeCreate(BTDataType* a, int n, int* pi)
{ if (n==0||a[*pi] == '#'){ (*pi)++;return NULL;}BTNode* root = (BTNode*)malloc(sizeof(BTNode));root->_data = a[(*pi)++];root->_left = BinaryTreeCreate(a, --n, pi);root->_right = BinaryTreeCreate(a, --n, pi);return root;}
形参中BTDataType* a是自定义类型的数组,用与给二叉树的结点赋值,int n是数组元素的个数,int*pi是当前将要放入二叉树的元素的下标。本方法适用于用前序遍历的结果来创建二叉树。若采用别的遍历方式需修改代码中调用函数和数组赋值的位置。
2.二叉树的销毁
// 二叉树销毁
void BinaryTreeDestory(BTNode** root)
{if (root == NULL){return;}if ((*root)->_left){free((*root)->_left);(*root)->_left = NULL;}if ((*root)->_right){free((*root)->_right);(*root)->_right = NULL;}free(*root);*root = NULL;return;
}
销毁采用后序遍历的方式,先销毁结点的左右子树,再销毁当前结点。若先销毁当前结点,无法找到该结点的左右子树的位置。
3.求二叉树结点的个数
// 二叉树节点个数
int BinaryTreeSize(BTNode* root)
{if (root == NULL){return 0;}return BinaryTreeSize(root->_left) + BinaryTreeSize(root->_right) + 1;}
采用后续遍历的方式,求出当前结点的左右子树的结点个数,相加后再加上当前结点(+1的由来)。
4.求叶子结点的个数
// 二叉树叶子节点个数
int BinaryTreeLeafSize(BTNode* root)
{if (root == NULL){return 0;}if (root->_left==NULL && root->_right==NULL){return 1;}return BinaryTreeLeafSize(root->_left) + BinaryTreeLeafSize(root->_right);}
叶子结点是左右子树都为空且自己本身不为空的结点,由于此处需要通过访问左右子树来判断,所以在这之前必须判断当前结点是否为空。在当前结点有子结点的时候,则访问子树,返回子树的叶子结点个数。
5.求第k层结点的个数
// 二叉树第k层节点个数
int BinaryTreeLevelKSize(BTNode* root, int k)
{if (root == NULL){return 0;}if (k == 1){return 1;}return BinaryTreeLevelKSize(root->_left, k - 1) + BinaryTreeLevelKSize(root->_right, k - 1);}
对当前结点的第k层,就是对当前结点的子节点的第k-1层。对于结点为空的判断和对层的判断先后顺序不能修改,因为可能会有k==1的时候是空结点的情况,此时不应该加1.(即k=2的时候恰好是叶子结点的情况)
6.查找值为x的结点
// 二叉树查找值为x的节点
BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{if (root == NULL){return NULL;}if (root->_data == x){return root;}BTNode* left = BinaryTreeFind(root->_left, x);if (left != NULL){return left;}return BinaryTreeFind(root->_right, x);}
通过先序遍历的方式遍历所有结点,找到值符合的就返回,都不符合的时候返回NULL。
此处判断左子树是否为空不判断右子树的原因是此时左子树已经为空,若右子树有则返回右子树,若右子树为空则返回右子树(也是空结点)。
7.层序遍历
// 层序遍历
void BinaryTreeLevelOrder(BTNode* root)
{queue<BTNode*> q;if (root == NULL){ return;}q.push(root); while (!q.empty()){BTNode* tmp = q.front();printf("%c ", tmp->_data);q.pop();if (tmp->_left){q.push(tmp->_left);}if (tmp->_right){q.push(tmp->_right);}}printf("\n");return;}
思路:通过队列先进先出的特性,使得当前队列中恒保持只有相邻两层或只有一层的结点的情况。
8.判断是否是满二叉树
// 判断二叉树是否是完全二叉树
int BinaryTreeComplete(BTNode* root)
{queue<BTNode*> q;if (root == NULL){return 1;}int count = 0;q.push(root);while (!q.empty()){BTNode* tmp = q.front();q.pop();if (tmp->_left&&count==0){q.push(tmp->_left);}else if (tmp->_left && count == 1){return 0;}else if(tmp->_left==NULL&&count==0){count = 1;}if (tmp->_right&&count==0){q.push(tmp->_right);}else if (tmp->_right && count == 1){return 0;}else if (tmp->_right == NULL && count == 0){count = 1;}}return 1;}
满二叉树的特性就是层序遍历的情况下,出现一次结点为空以后,就不会再有结点不为空的情况,此处用count=1表示第一次遇到结点为空,此后存在两种情况,一种是后面的结点全是空,最后队列为空退出,此时是满二叉树。一种情况是后面又遇到非空结点,由于此时count已经等于1了,则不是满二叉树。
相关文章:
二叉树实现的相关函数
1.二叉树的创建 BTNode* BinaryTreeCreate(BTDataType* a, int n, int* pi) { if (n0||a[*pi] #){ (*pi);return NULL;}BTNode* root (BTNode*)malloc(sizeof(BTNode));root->_data a[(*pi)];root->_left BinaryTreeCreate(a, --n, pi);root->_right Binary…...
Redis面试题(二)
文章目录 前言一、Redis 支持的 Java 客户端都有哪些?官方推荐用哪个?二、Redis 和 Redisson 有什么关系?三、Jedis 与 Redisson 对比有什么优缺点?四、说说 Redis 哈希槽的概念?五、Redis 集群的主从复制模型是怎样的…...
STP介绍
目录 STP概述 二层环路带来的问题 1.广播风暴 2.MAC地址漂移问题 3.多帧复制---这个好理解,同一个数据帧被重复收到多次,被称为多帧复制。 802.1D生成树 STP的BPDU BPDU主要分为两大类 配置BPDU RPC COST 配置BPDU的工作过程 TCN BPDU TCN…...
numpy 和 tensorflow 中的各种乘法(点乘和矩阵乘)
嗨喽,大家好呀~这里是爱看美女的茜茜呐 👇 👇 👇 更多精彩机密、教程,尽在下方,赶紧点击了解吧~ python源码、视频教程、插件安装教程、资料我都准备好了,直接在文末名片自取就可 点乘和矩阵乘…...
(图论) 1020. 飞地的数量 ——【Leetcode每日一题】
❓ 1020. 飞地的数量 难度:中等 给你一个大小为 m x n 的二进制矩阵 grid ,其中 0 表示一个 海洋单元格、1 表示一个 陆地单元格。 一次 移动 是指从一个陆地单元格走到另一个相邻(上、下、左、右)的陆地单元格或跨过 grid 的边…...
c++ 重载、重写、覆盖
重载:指在同一作用域内,有多个同名但参数不同的函数的现象,叫重载;可以是任何用户定义的函数,例如 类成员函数、类静态函数、普通函数重写:子类重写父类的同名函数,只要子类出现有父类的同名函数…...
Python异步编程高并发执行爬虫采集,用回调函数解析响应
一、问题:当发送API请求,读写数据库任务较重时,程序运行效率急剧下降。 异步技术是Python编程中对提升性能非常重要的一项技术。在实际应用,经常面临对外发送网络请求,调用外部接口,或者不断更新数据库或文…...
SpriteKit与Swift配合:打造您的第一个简易RPG游戏的步骤指南
1. 简介: RPG(Role-Playing Game)游戏是一种角色扮演游戏,它允许玩家在一个虚拟的游戏世界中扮演一个或多个角色。在本教程中,我们将使用Apple的2D游戏框架SpriteKit和Swift编程语言来创建一个简单的RPG游戏。我们将从…...
服务网格的面临挑战:探讨服务网格实施中可能遇到的问题和解决方案
🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…...
leetcode61 旋转链表
题目 给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。 示例 输入:head [1,2,3,4,5], k 2 输出:[4,5,1,2,3] 解析 这道题属实不好想:需要计算出链表的长度,然后在k > n的…...
【学习笔记】各类基于决策单调性的dp优化
文章目录 对于决策单调性的一般解释关于决策单调性的证明四边形不等式一维dp区间dp一种二维dp一些满足四边形不等式的函数类 与图形相结合 决策单调性的常见优化手段二分队列二分栈分治类莫队做法 SMAWKWQS二分WQS多解情况满足四边形不等式的序列划分问题的答案凸性以及WQS二分…...
【C++】构造函数初始化列表 ⑤ ( 匿名对象 生命周期 | 构造函数 中 不能调用 构造函数 )
文章目录 一、匿名对象 生命周期1、匿名对象 生命周期 说明2、代码示例 - 匿名对象 生命周期 二、构造函数 中调用 构造函数1、构造函数 中 不能调用 构造函数2、代码示例 - 构造函数中调用构造函数 构造函数初始化列表 总结 : 初始化列表 可以 为 类的 成员变量 提供初始值 ;…...
Knife4j系列--使用方法
原文网址:Knife4j系列--使用/教程/实例/配置_IT利刃出鞘的博客-CSDN博客...
pmp项目管理考试是什么?适合哪些人学?
PMP,简单点说,就是美国PMI为考察项目管理人士的专业能力而设立的考试。 该流程以知识和任务驱动型指南评估从业者的能力,同时确定项目经理能力行业标准,包括各项知识、任务和技能的特点、重要性与运用频率。(考纲原文…...
CSDN博客可以添加联系方式了
csdn博客一直不允许留一些联系方式,结果是官方有联系方式路径 在首页,往下拉,左侧就有 点击这个即可添加好友了~ 美滋滋,一起交流, 学习技术 ~...
小程序隐私弹窗的实现
小程序的开发者对于微信官方来说是有爱有恨,三天二头整事是鹅厂的一贯风格。 隐私弹窗的几个要点 回归正题,小程序隐私弹窗的几个要点: 1、何时弹出用户隐私协议的弹窗? 2、是每次进小程序都弹出来吗? 这两个想明…...
【JavaEE】多线程案例-单例模式
文章目录 1. 前言2. 什么是单例模式3. 如何实现单例模式3.1 饿汉模式3.2 懒汉模式4. 解决单例模式中遇到的线程安全问题4.1 加锁4.2 加上一个判断解决频繁加锁问题4.2 解决因指令重排序造成的线程不安全问题 1. 前言 单例模式是我们面试中最常考到的设计模式。什么是设计模式呢…...
社区分享|MeterSphere变身“啄木鸟”,助力云帐房落地接口自动化测试
云帐房网络科技有限公司(以下简称为“云帐房”)成立于2015年3月,以“成为最值得信赖的税务智能公司”为愿景,运用人工智能、大数据等互联网技术,结合深厚的财税行业服务经验,为代账公司和中大型企业提供智能…...
fpga内嵌逻辑分析仪使用方法
文章目录 前言一、方法1 — 使用 IP 核创建 ILA 调试环境1、创建 ILA ip 核2、进行例化3、生成比特流文件4、下载程序5、进行在线调试 二、方法2 — 使用 Debug 标记创建 ILA1、Debug 标记相关信号2、综合操作3、设置 Set Up Debug4、生成比特文件5、下载程序6、进行在线调试 前…...
第14章 结构和其他数据形式
本章介绍以下内容: 关键字:struct、union、typedef 运算符:.、-> 什么是C结构,如何创建结构模板和结构变量 如何访问结构的成员,如何编写处理结构的函数 联合和指向函数的指针 设计程序时,最重要的步骤之…...
终极免费跨平台方案:3步将知网CAJ论文转换为可编辑PDF的完整指南
终极免费跨平台方案:3步将知网CAJ论文转换为可编辑PDF的完整指南 【免费下载链接】caj2pdf Convert CAJ (China Academic Journals) files to PDF. 转换中国知网 CAJ 格式文献为 PDF。佛系转换,成功与否,皆是玄学。 项目地址: https://gitc…...
激活沉睡用户:WPF应用的唤醒策略
在现代软件开发中,如何有效地激活沉睡用户是每个应用开发者都需要面对的问题。特别是对于WPF(Windows Presentation Foundation)应用来说,如何在用户不活跃一段时间后,重新唤醒他们的兴趣并引导他们回到应用中使用,是一个既有挑战又有策略性的任务。本文将介绍如何通过邮…...
HUSTOJ:如何快速搭建你自己的在线评测系统?完整教程指南
HUSTOJ:如何快速搭建你自己的在线评测系统?完整教程指南 【免费下载链接】hustoj Popular Simple Open Source Online Judge based on PHP/C/MySQL/Linux for ACM/ICPC and NOIP training, with easy installation. 简单实用的开源OJ系统 项目地址: ht…...
CTFd平台集成MCP协议:AI助手赋能CTF赛事智能运维实践
1. 项目概述:CTFd与MCP的融合实践最近在安全圈和CTF(Capture The Flag,夺旗赛)赛事运维圈子里,一个名为AaryaBhusal/ctfd-mcp的项目引起了我的注意。乍一看,这像是一个针对CTFd平台的插件或扩展,…...
从零组装一台智能避障小车:STM32F103RCT6核心控制板、SG90舵机与HC-SR04超声波模块的软硬件联调全记录
从零构建智能避障小车:STM32F103RCT6核心与多传感器融合实战指南 在创客圈里,智能小车一直是验证嵌入式系统能力的经典项目。当传统的循迹小车已经不能满足你的技术探索欲望时,为它装上"眼睛"和"大脑",打造一…...
Epson M-G366PDG:工业级高性能惯性测量单元,精准稳定首选
引言在工业自动化、机器人、无人机等领域,惯性测量单元(IMU)是至关重要的传感器之一。它能够提供高精度的姿态和运动数据,从而确保系统的稳定性和可靠性。Epson M-G366PDG 作为一款工业级高性能 IMU,凭借其卓越的性能和…...
别再死记公式了!用Python+NetworkX可视化理解关系闭包(附完整代码)
用PythonNetworkX玩转关系闭包:从数学抽象到动态可视化的实战指南 第一次接触"关系闭包"这个概念时,我盯着课本上那些晦涩的数学符号和矩阵运算整整半小时,依然云里雾里。直到我用Python的NetworkX库将社交网络中的关注关系画成图形…...
PID控温实战:从STM32的PWM输出到加热棒,手把手教你调出稳定曲线
PID控温实战:从STM32的PWM输出到加热棒的温度控制艺术 在工业自动化、智能家居和实验室设备中,精确的温度控制一直是开发者面临的经典挑战。想象一下,当你需要将一块金属加热到200C并保持稳定,或者让培养箱维持在37C0.1C的精度时&…...
Spring Boot项目集成GitLab OAuth登录保姆级教程(含完整代码)
Spring Boot项目集成GitLab OAuth登录生产级实践指南 企业级应用开发中,统一身份认证是基础架构的关键环节。GitLab作为主流的代码托管平台,其OAuth服务为开发者提供了便捷的第三方登录解决方案。本文将深入探讨如何在Spring Boot项目中实现生产级的GitL…...
Unlock-Music:3分钟解锁加密音乐,让你的音乐库重获自由 [特殊字符]
Unlock-Music:3分钟解锁加密音乐,让你的音乐库重获自由 🎵 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.de…...
