重生之“我打数据结构,真的假的?”--4.二叉树(无习题)

1.二叉树

1.1概念与结构

在树形结构中,我们最常⽤的就是⼆叉树,⼀棵⼆叉树是结点的⼀个有限集合,该集合由⼀个根结点 加上两棵别称为左⼦树和右⼦树的⼆叉树组成或者为空。

1. ⼆叉树不存在度⼤于 2 的结点

2. ⼆叉树的⼦树有左右之分,次序不能颠倒,因此⼆叉树是有序树

1.2满二叉树 

⼀个⼆叉树,如果每⼀个层的结点数都达到最⼤值,则这个⼆叉树就是满⼆叉树。也就是说,如果⼀ 个⼆叉树的层数为 K ,且结点总数是 (2的k次方-1) ,则它就是满⼆叉树。

1.3二叉树的性质

⼆叉树性质 根据满⼆叉树的特点可知:

1)若规定根结点的层数为 1 ,则⼀棵⾮空⼆叉树的第i层上最多有 (2 的i-1次方 )个结点

2)若规定根结点的层数为 1 ,则深度为 h 的⼆叉树的最⼤结点数是 (2的h次方-1)

3)若规定根结点的层数为 1 ,具有 n 个结点的满⼆叉树深度 h = log2 (n + 1) ( log 以2为底, n+1 为对数)

1.4完全二叉树

1、叶子结点只可能在最大的两层上出现,对任意结点,若其右分支下的子孙最大层次为L,则其左分支下的子孙的最大层次必为L 或 L+1;
2、出于简便起见,完全二叉树通常采用数组而不是链表存储。
3、满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树。
4、完全二叉树第i层至多有2的(i-1)次方个节点,共i层的完全二叉树最多有2的i次方-1个节点。
5、只允许最后一层有空缺结点且空缺在右边,即叶子结点只能在层次最大的两层上出现;
6、对任一结点,如果其右子树的深度为j,则其左子树的深度必为j或j+1。 即度为1的点只有1个或0个。

2.二叉树的存储结构

2.1顺序结构

顺序结构存储就是使⽤数组来存储,⼀般使⽤数组只适合表⽰完全⼆叉树,因为不是完全⼆叉树会有 空间的浪费,完全⼆叉树更适合使⽤顺序结构存储。

2.2链式结构

⼆叉树的链式存储结构是指,⽤链表来表⽰⼀棵⼆叉树,即⽤链来指⽰元素的逻辑关系。 通常的⽅法 是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别⽤来给出该结点左孩⼦和右孩 ⼦所在的链结点的存储地址 。

2.3实现链式结构⼆叉树 

 

typedef int BTDataType;
// ⼆叉链
typedef struct BinaryTreeNode
{
struct BinTreeNode* left; // 指向当前结点左孩⼦
struct BinTreeNode* right; // 指向当前结点右孩⼦
BTDataType val; // 当前结点值域
}BTNode;BTNode* BuyBTNode(int val)
{
BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));
if (newnode == NULL)
{
perror("malloc fail");
return NULL;
}
newnode->val = val;
newnode->left = NULL;
newnode->right = NULL;
return newnode;
}                      //初始化

3.功能实现

3.1 销毁二叉树

void BinaryTreeDestory(BTnode** root)//要传二级指针,因为要改变根节点为NULL;而根节点是指针,改变指针需要传二级指针
{if(*root==NULL)return;BinaryTreeDestory(&((*root)->left));BinaryTreeDestory(&((*root)->right));free(*root);*root=NULL;}

3.2 层序遍历(!!!!!)

单纯递归是无法解决层序遍历问题的,实现层序遍历需要额外借助数据结构:队列(!!!!!)

// 层序遍历
void LevelOrder(BTNode* root)
{Queue q;QueueInit(&q);QueuePush(&q, root);while (!QueueEmpty(&q)){BTNode* top = QueueFront(&q);printf("%c ", top->data);QueuePop(&q);if (top->_left){QueuePush(&q, top->_left);}if (top->_right){QueuePush(&q, top->_right);}}
QueueDesTroy(&q);
}

 3.3判断是否为完全⼆叉树

// 判断⼆叉树是否是完全⼆叉树
bool BinaryTreeComplete(BTNode* root)
{Queue q;QueueInit(&q);QueuePush(&q, root);while (!QueueEmpty(&q)){BTNode* top = QueueFront(&q);QueuePop(&q);if (top == NULL){break;}QueuePush(&q, top->_left);QueuePush(&q, top->_right);}while (!QueueEmpty(&q))      //如果为完全二叉树,只允许最后一层有空缺节点,且在右边,所以最后队列的元素一定只有NULL(可能有好几个NULL){BTNode* top = QueueFront(&q);QueuePop(&q);if (top != NULL)           //不是NULL,一定不是完全二叉树{QueueDesTroy(&q);return false;}}QueueDesTroy(&q);return true;
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

《梦醒蝶飞:释放Excel函数与公式的力量》20.2 教学材料的自动化处理

第20章:自动化教学辅助工具 20.2 教学材料的自动化处理 自动化处理教学材料是利用编程技术和工具,自动执行教学材料的生成、整理和分发等任务的过程。通过自动化,可以提高教学材料处理的效率,减少手动操作的时间,从而…

用Swagger进行后端接口测试的实战操作

目录 一.什么是Swagger? 二.Swagger的使用操作流程: 1.在pom.xml配置文件导入 Knife4j 的依赖: 2.在config配置类中加入 Knife4j 的相关配置并设置静态资源映射(否则接口文档无法访问): 三.Swagger的四个…

InteliJ IDEA最新2024版下载安装与快速配置激活使用教程+jdk下载配置

第一步:下载ideaIC-2024.1.4 方法1:在线链接 IntelliJ IDEA – the Leading Java and Kotlin IDE (jetbrains.com) 选择社区版进行下载 方法2:百度网盘 链接:https://pan.baidu.com/s/1ydS6krUX6eE_AdW4uGV_6w?pwdsbfm 提取…

解决django与sqlite3不兼容报SQLite 3.9.0 or later is required错的问题

今天在尝试用pytest进行django的单元测试,pytest用的数据库是sqlite3,在window环境下测试得好好的,但是放到linux环境下就报错,具体是报django.core.exceptions.ImproperlyConfigured: SQLite 3.9.0 or later is required (found …

LabVIEW学习-LabVIEW处理带分隔符的字符串从而获取数据

带分隔符的字符串很好处理,只需要使用"分隔符字符串至一维字符串数组"函数或者"一维字符串数组至分隔符字符串"函数就可以很轻松地处理带分隔符地字符串。 这两个函数所在的位置为: 函数选板->字符串->附加字符串函数->分…

超声波俱乐部:AI应用大爆发前夜,场景、闭环与LLM进化

7月13日,第十九期超声波俱乐部内部分享会在北京望京举行,本期的主题是:AI应用大爆发前夜,场景、闭环与LLM进化。 到场的嘉宾有:超声波创始人杨子超,超声波联合创始人、和牛商业创始人刘思雨,豆…

html+css 边框滑动按钮效果

前言:哈喽,大家好,今天给大家分享htmlcss 绚丽效果!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 文…

基于 HTML+ECharts 实现智慧工地数据可视化大屏(含源码)

构建智慧工地数据可视化大屏:基于 HTML 和 ECharts 的实现 智慧工地已成为建筑行业的新趋势。通过实时监控和数据分析,智慧工地可以提高施工效率、降低安全风险。本文将详细介绍如何利用 HTML 和 ECharts 实现一个功能强大的智慧工地数据可视化大屏。 源…

vue3前端开发-小兔鲜项目-sku的实现

vue3前端开发-小兔鲜项目-sku的实现!这是一个会计学的特殊专业名词,可以理解为产品的型号,规格的货品计量单位。 它是一组数据的混合体。比如:尺寸,材料,品质,等等。组合在一起形成的一个混合数…

pikachu Fileinclusion(local)

随便选择一个都试试 发现url上数字会变 发现文件名确实是file1.php~file5.php 那么会不会还有别的burp抓包选中数字 设置6-100的爆破 strat attack 678异常还有个100也是 先改一下试试看 其他的会报错 但是通过这我们可以得到路径 先写一个 下一步 读取系统文件 windows系统肯定…

产品系统的UI暗色系和浅色系模式切换是符合人体视觉工程学的设计

视觉革命:UI设计中的暗夜与黎明 UI设计如同夜空中最亮的星辰,引领着用户穿梭于信息的海洋。而今,一场视觉革命正在悄然上演,它关乎于我们的眼睛,关乎于我们的体验——那就是产品系统的UI暗色系和浅色系模式的切换。如…

Git merge

Git merge 参考文档: https://marsishandsome.github.io/2019/07/Three_Way_Merge https://git-scm.com/docs/merge-strategies https://stackoverflow.com/questions/56889406/how-does-git-compare-two-files-while-merging Git merge的目标是合并changes&#x…

web小项目-曼波生日录(Servlet+JSP+MySQL)

效果演示: 当记录条数过多时会自动出现滚轮,数据不会超出紫框 数据库实时记录: 项目源代码以及所用到的资源: 链接: https://pan.baidu.com/s/1w0czmH9xBfetk7CZ7RNbtQ?pwd6666 提取码: 6666 复制这段内容后打开百度网盘手机App…

vue3+openLayers点击标记事件

<template><!--地图--><div class"distributeMap" id"distributeMap"></div> </template> <script lang"ts" setup> import { onMounted, reactive } from "vue"; import { Feature, Map, View }…

一款允许使用Docker部署本地托管的、基于 Web 的 PDF 操作工具

大家好&#xff0c;今天给大家分享的是一个基于Spring Boot开发的开源项目&#xff0c;旨在提供一个功能强大的基于Docker的本地托管PDF操作工具Stirling PDF。 项目介绍 Stirling-PDF是一个全面的PDF工具箱&#xff0c;适用于个人和企业用户&#xff0c;尤其对于那些重视数据…

华杉研发九学习日记17 正则表达式 异常

华杉研发九学习日记17 一&#xff0c;正则表达式 ^ $ 作用&#xff1a; 测试字符串内的模式(匹配) 例如&#xff0c;可以测试输入字符串&#xff0c;以查看字符串内是否出现电话号码模式或信用卡号码模式。这称为数据验证. 替换文本&#xff08;替换》 可以使用正则表达式来…

谷粒商城实战笔记-59-商品服务-API-品牌管理-使用逆向工程的前后端代码

文章目录 一&#xff0c; 使用逆向工程生成的代码二&#xff0c;生成品牌管理菜单三&#xff0c;几个小问题 在本次的技术实践中&#xff0c;我们利用逆向工程的方法成功地为后台管理系统增加了品牌管理功能。这种开发方式不仅能快速地构建起功能模块&#xff0c;还能在一定程度…

Elasticsearch 7.x入门学习-Java API操作

1 创建项目 在idea开发工具中创建Maven项目 修改 pom 文件&#xff0c;增加 Maven 依赖关系 <dependencies><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.8.0</versi…

MySQL学习(13):SQL优化:查看SQL语句性能的方法

1.查看SOL执行频率 MySQL客户端连接成功后&#xff0c;通过如下指令&#xff0c;可以查看当前数据库的insert、update、delete、select的访问频次: show global status like Com_______; #查看全局。后面是7个下划线 使用效果如下&#xff1a; 可以看到各条命令的使用次数。…

springboot 多个jar下有相同全限定名类加载顺序

一、问题说明 项目中使用了密码机&#xff0c;应用系统需要集成密码机厂商的jar包。应用系统支持使用不同厂家的密码机&#xff0c;并且为了保证应用层代码不受影响&#xff0c;要求密码机厂商提供相同的类定义&#xff08;全限定名&#xff09;&#xff0c;但不同密码机厂商提…