数据结构——lesson8二叉树的实现

💞💞 前言

hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹
在这里插入图片描述

💥个人主页:大耳朵土土垚的博客
💥 所属专栏:数据结构学习笔记
💥对于数据结构顺序表、链表、堆有疑问的都可以在上面数据结构的专栏进行学习哦~ 有问题可以写在评论区或者私信我哦~

前面我们学习过二叉树的前、中、后序遍历 以及二叉树层序遍历,今天我们将继续学习有关二叉树的实现🥳🥳🥳

1.二叉树的构建

1.1二叉树的结构

typedef char BTDataType;//这里使用字符类型方便看下面的ABC等字母
//typedef int BTDataType;其他我们使用int
typedef struct BinaryTreeNode
{BTDataType data;struct BinaryTreeNode* left;struct BinaryTreeNode* right;
}BTNode;//二叉树的结构

二叉树每个节点应该包含该节点的值,以及其左右子节点的地址

1.2创建二叉树新节点

//创建新节点
BTNode* BuyNode(BTDataType x)
{BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));if (newnode == NULL){perror("malloc fail");return NULL;}newnode->data = x;return newnode;
}

使用malloc函数创建节点,最后销毁时要使用free来释放,malloc大小为BTNode的节点;
对于mallc函数有疑问的可以查看土土的博客——动态内存函数介绍;

1.3创建二叉树

以数组"ABD##E#H##CF##G##"为例

// 通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树
BTNode* BinaryTreeCreate(BTDataType* a, int* pi)
{if(a[*pi] == '#'){(*pi)++;return NULL;}BTNode* root = BuyNode(a[*pi]);(*pi)++;root->left = BinaryTreeCreate(a, pi);root->right = BinaryTreeCreate(a, pi);return root;
}

利用监视进行可视化如下:
在这里插入图片描述

在这里插入图片描述
可以看到形成了逻辑结构如下图所示的二叉树:
在这里插入图片描述

我们将这里的’#'当作空的标志,用来实现二叉树的结构,并利用递归左子树右子树来构建二叉树。

2.二叉树的销毁

// 二叉树销毁
void BinaryTreeDestroy(BTNode* root)
{if (root == NULL)return;//类似于后序,先释放左右子树再释放根节点BinaryTreeDestroy(root->left);BinaryTreeDestroy(root->right);free(root);
}

这里二叉树的销毁需要对二叉树进行遍历,我们前面学习过四种二叉树的遍历——前、中、后序以及层序遍历,对于销毁二叉树来说使用后序遍历比较合适,因为先释放左右子树再释放根节点这样可以防止找不到节点。

3.二叉树节点个数

// 二叉树节点个数
int BinaryTreeSize(BTNode* root)
{/*if (root == NULL)return 0;return BinaryTreeSize(root->left) + BinaryTreeSize(root->right) + 1;*/return root == NULL ? 0 : BinaryTreeSize(root->left)+ BinaryTreeSize(root->right) + 1;
}

如果节点是空就返回,不是空就继续递归找其左子树右子树直到找到空也就是叶子节点的左右子树,此时再递归返回叶子节点的父节点时要+1,用来表示计算的叶子节点;依次类推不是NULL就+1,这样最后就是二叉树节点的个数了;图解如下:
以下图为例:
在这里插入图片描述
1.找到NULL:
在这里插入图片描述返回左右子树为空后要+1;
2.依次类推递归返回:
在这里插入图片描述
在这里插入图片描述

也可以看下面的递归展开图:
以下图为例:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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);
}

叶子节点对应其左右子树都为空,就返回1,利用递归实现

5.二叉树第k层节点个数

// 二叉树第k层节点个数
int BinaryTreeLevelKSize(BTNode* root, int k)
{assert(k);if(root == NULL)return 0;//k层节点个数if (k == 1)return 1;return BinaryTreeLevelKSize(root->left, k - 1) + BinaryTreeLevelKSize(root->right, k - 1);
}

我们可以利用k-1依次往下递归,直到k = 1 时此时,就是第k层就返回1;

6.二叉树查找

// 二叉树查找值为x的节点
BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{if (root == NULL)return NULL;//前序遍历来查找if (root->data == x){return root;}BTNode* res1 = BinaryTreeFind(root->left, x);if (res1)return res1;BTNode* res2 = BinaryTreeFind(root->right, x);if (res2)return res2;//没有找到返回空return NULL;
}

在运用递归时要返回值时记得将递归找到的值保存起来,防止找不到耗费力气重新再找。

7.二叉树高度

//求二叉树高度
int BTreeHeight(BTNode* root)
{if (root == NULL)return 0;int leftHeight = BTreeHeight(root->left);int rightHeight = BTreeHeight(root->right);return leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1;
}

类似于二叉树节点个数的递归,返回时每次+1,并且我们还需要将每次计算的高度与二叉树查找一样保存起来防止浪费时间再去遍历查找,此外左子树右子树高度不一致时要取较大的那一个;

8.判断是否是完全二叉树

在此之前我们先回顾一下特殊的二叉树:

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

这里判断是否为完全二叉树的实现与之前讲过的二叉树层序遍历相似需要利用队列来实现,队列的实现在这——二叉树层序遍历里面包含队列代码的完整实现,这里就不过多描述,我们直接来使用。记得使用时要先写队列并包含对应的头文件哦~

// 判断二叉树是否是完全二叉树
bool BinaryTreeComplete(BTNode* root)
{//利用队列先进先出的特点Queue qt;QueueInit(&qt);if (root)//如果根节点非空则入队列QueuePush(&qt, root);while (!QueueEmpty(&qt))//判断队列非空{QDataType front = QueueFront(&qt);//取出队头元素QueuePop(&qt);if (front == NULL)break;//遇到空就跳出QueuePush(&qt, front->left);//再将左右子树的节点入队列QueuePush(&qt, front->right);}//break跳出后//判断之后的元素是否有非空值//有非空值则不是完全二叉树while (!QueueEmpty(&qt)){QDataType front = QueueFront(&qt);QueuePop(&qt);if (front != NULL){QueueDestroy(&qt);return false;}}//如果没有非空值返回trueQueueDestroy(&qt);return true;
}

思路:利用二叉树的层序遍历,层序遍历一遍如果有空指针NULL且队列非空时如果队列里面还有非空值那么就不是完全二叉树。

9.结语

以上就是有关二叉树实现的内容啦 ~ 关键是要理解递归是怎么实现的,利用二叉树由根节点、左右子树构成的特性来实现递归,完结撒花 ~🥳🥳🎉🎉🎉

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

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

相关文章

论文阅读——BLIP

BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation (1)单模态编码器,它分别对图像和文本进行编码。图像编码器用ViT,并使用附加的 [CLS] 标记来表示全局图像特征。文本…

springcloud:4.1 GateWay

概述 Gateway 简介 Spring Cloud Gateway基于Spring 5.0、SpringBoot 2.0和Project Reactor等技术开发 旨在为微服务架构提供一种简单有效的、统一的API路由管理方式,并为微服务架构提供安全、监控、指标和弹性等功能 其目标是替代Zuul特点 易于编写谓词和过滤器&…

解决谷歌浏览器最新chrome94版本CORS跨域问题

项目场景: 谷歌浏览器升级到chrome94版本出现CORS跨域问题 问题描述 解决谷歌浏览器最新chrome94版本CORS跨域问题。 CORS跨域问题: 升级谷歌浏览器最新chrome94版本后,提示Access to XMLHttpRequest at ‘http://localhost:xxxx/api’ fro…

zabbix企业微信接入结合海螺问问编写的shell脚本

前言 博客懒得写详细了,视频剪的累死了,看视频就好了 白帽小丑的个人空间-白帽小丑个人主页-哔哩哔哩视频 shell脚本 #!/bin/bash #set -x CorpID"" #我的企业下面的CorpID Secret"" #创建的应用那…

C到C++的敲门砖-1

文章目录 关键字命名空间输入和输出缺省参数函数重载 关键字 相较于C语言32个关键字: autodoubleintstructbreakelselongswitchcaseenumregistertypedefcharexternreturnunionconstfloatshortunsignedcontinueforsignedvoiddefaultgotosizeofvolatiledoifwhilesta…

用python写网络爬虫:2.urllib库的基本用法

文章目录 urllib库抓取网页data参数timeout参数更灵活地配置参数登录代理Cookies 参考书籍 建议新入门的小伙伴先看我同一专栏的文章:用python写网络爬虫:1.基础知识 urllib库 urllib是python中一个最基础的HTTP库,一般是内置的,…

2024年 前端JavaScript Web APIs 第三天 笔记

3.1-表单全选反选案例 <!DOCTYPE html><html><head lang"en"><meta charset"UTF-8"><title></title><style>* {margin: 0;padding: 0;}table {border-collapse: collapse;border-spacing: 0;border: 1px solid …

网络安全实训Day5

写在前面 昨天忘更新了......讲的内容不多&#xff0c;就一个NAT。 之前记的NAT的内容&#xff1a;blog.csdn.net/Yisitelz/article/details/131840119 网络安全实训-网络工程 NAT 公网地址与私网地址 公网地址 可以在互联网上被寻址&#xff0c;由运营商统一分配全球唯一的I…

在 Windows 上利用Qwen大模型搭建一个 ChatGPT 式的问答小助手

本文首发于公众号&#xff1a;Hunter后端 原文链接&#xff1a;在 Windows 上利用Qwen大模型搭建一个 ChatGPT 式的问答小助手 最近 ChatGPT 式的聊天机器人比较火&#xff0c;可以提供各种问答功能&#xff0c;阿里最近推出了 Qwen1.5 系列的大模型&#xff0c;提供了各个参数…

在线BLOG网|基于springboot框架+ Mysql+Java+JSP技术的在线BLOG网设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 管理员功能登录前台功能效果图 系统功能设计 数据库E-R图设计 lunwen参考 摘要 研究…

【C#算法实现】可见的山峰对数量

文章目录 前言一、题目要求二、算法设计及代码实现2.1 算法思想2.2 代码实现 前言 本文是【程序员代码面试指南&#xff08;第二版&#xff09;学习笔记】C#版算法实现系列之一&#xff0c;用C#实现了《程序员代码面试指南》&#xff08;第二版&#xff09;栈和队列中的可见的…

OpenCV-Java 开发简介

返回目录&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a; 如何在“Microsoft Visual Studio”中使用OpenCV编译应用程序 下一篇&#xff1a;暂无 ​ 警告&#xff1a; 本教程可能包含过时的信息。 从 OpenCV 2.4.4 开始&…

java集合框架——Map集合概述

前言&#xff1a; 之前接触了单列合集&#xff0c;现在又接触了双列合集。整理下心得&#xff0c;打好基础&#xff0c;daydayup&#xff01;&#xff01; Map集合 Map集合称为双列集合&#xff0c;也被称为“键值对集合”。格式&#xff1a;{key1value1,key2value2...}&#…

【GPT-SOVITS-01】源码梳理

说明&#xff1a;该系列文章从本人知乎账号迁入&#xff0c;主要原因是知乎图片附件过于模糊。 知乎专栏地址&#xff1a; 语音生成专栏 系列文章地址&#xff1a; 【GPT-SOVITS-01】源码梳理 【GPT-SOVITS-02】GPT模块解析 【GPT-SOVITS-03】SOVITS 模块-生成模型解析 【G…

jwt以及加密完善博客系统

目录 一、背景 二、传统登陆功能&强制登陆功能 1、传统的实现方式 2、session存在的问题 三、jwt--令牌技术 1、实现过程 2、令牌内容 3、生成令牌 4、检验令牌 四、JWT登陆功能&强制登陆功能 1、JWT实现登陆功能 2、强制登陆功能 3、运行效果 五、加密/加…

论文阅读——SpectralGPT

SpectralGPT: Spectral Foundation Model SpectralGPT的通用RS基础模型&#xff0c;该模型专门用于使用新型3D生成预训练Transformer&#xff08;GPT&#xff09;处理光谱RS图像。 重建损失由两个部分组成&#xff1a;令牌到令牌和频谱到频谱 下游任务&#xff1a;

[数据集][目标检测]铝片表面工业缺陷检测数据集VOC+YOLO格式400张4类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;400 标注数量(xml文件个数)&#xff1a;400 标注数量(txt文件个数)&#xff1a;400 标注类别…

Coursera上Golang专项课程2:Functions, Methods, and Interfaces in Go 学习笔记

Functions, Methods, and Interfaces in Go Course Certificate 本文是学习 Functions, Methods, and Interfaces in Go 这门课的学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。 文章目录 Functions, Methods, and Interfaces in GoMODULE 1: FUNCTIONS AND ORGANIZ…

Epuck2机器人固件更新及IP查询

文章目录 前言一、下载固件更新软件包&#xff1a;二、查询机器人在局域网下的IP 前言 前面进行了多机器人编队仿真包括集中式和分布式&#xff0c;最近打算在实物机器人上跑一跑之前的编队算法。但由于Epuck2机器人长时间没使用&#xff0c;故对其进行固件的更新&#xff0c;…

【Godot4.0】几何图形、网格、刻度线顶点求取函数库ShapePoints

概述 用于生成常见二维几何图形顶点数据&#xff08;PackedVector2Array&#xff09;的静态函数库。 生成的数据可用于_draw和Line2D、Polygon2D等进行绘制和显示。 枚举 enum{AXIS_X 1,AXIS_Y 2, }enum{SIDE_UP 1,SIDE_RIGHT 2,SIDE_BOTTOM 3,SIDE_LEFT 4 }测试场景 …