当前位置: 首页 > news >正文

二叉树——数据结构

这次我们来学习一下数据结构中的二叉树

1. 二叉树的概念及结构

1.1 二叉树的定义

定义:所有结点的度小于等于2的树。

上图中可以看出

  1. 二叉树不存在度大于2的结点
  2. 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树

任意二叉树都是由以下几种情况复合而成的

1.2 特殊的几种二叉树

完全二叉树

完全二叉树。一棵高度为h的二叉树,  除最后一层以外的其他所有层上的结点数都达到最大值,而最后一层上的所有结点分布在该层最左边的连续的位置上。
完全二叉树有如下特点,叶子结点只能在层次最大和次大的两个层次上出现。对任一结点,如果其左子树的高度为m,则其右子树的高度必为m或者m-1。

满二叉树

满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是2^k -1,则它就是满二叉树。

注意:满二叉树一定是完全二叉树,但完全二叉树不一定是满二叉树!!!

扩充二叉树

把原二叉树所有结点中出现空的子树的位置都增加特殊的结点--空树叶,得到的二叉树就是扩充二叉树。

2.二叉树的性质


1.若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有 2⁽ⁱ⁻¹⁾ 个结点。
2.若规定根节点的层数为1,则深度为h的二叉树的最大结点数是 2ʰ-1。
3.对任何一棵二叉树,如果度为0其叶结点个数为n₀,度为2的分支结点个数为n₂,,则有n₀=n₂+1
4.若规定根节点的层数为1,具有n个结点的满二叉树的深度, h=log₂(n+1)。

(ps:log₂(n+1))是 log以2为底,n+1为对数)
5.对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有结点从0开始编号,则对于序号为 i 的结点有:

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


3. 二叉树的存储结构

二叉树一般可以使用两种结构存储,一种顺序结构,一种链式结构。

1. 顺序存储

        顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。而现实中使用中只有堆才会使用数组来存储二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树

2. 链式存储

        二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常的方法是 链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所 在的链结点的存储地址 。链式结构又分为二叉链和三叉链,当前学习中一般都是二叉链,高阶数据结构如红黑树等会用到三叉链。

typedef int BTDataType;
// 二叉链
struct BinaryTreeNode
{struct BinTreeNode* _pLeft; // 指向当前节点左孩子struct BinTreeNode* _pRight; // 指向当前节点右孩子BTDataType _data; // 当前节点值域
}
// 三叉链
struct BinaryTreeNode
{struct BinTreeNode* _pParent; // 指向当前节点的双亲struct BinTreeNode* _pLeft; // 指向当前节点左孩子struct BinTreeNode* _pRight; // 指向当前节点右孩子BTDataType _data; // 当前节点值域

少年没有乌托邦,心向远方自明朗!

如果这个博客对你有帮助,给博主一个免费的点赞就是最大的帮助
欢迎各位点赞,收藏关注
如果有疑问或有不同见解,欢迎在评论区留言
后续会继续更新大连理工大学相关课程和有关数据结构的内容和示例
点赞加关注,学习不迷路,好,本次的学习就到这里啦!!!

我们下次再见喽!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 代理IP批理检测工具,支持socks5,socks4,http和https代理批量检测是否可用
  • Netty笔记03-组件Channel
  • 苹果华为轮番炒作,AI眼镜会是下一个大热点吗?
  • opencv滤波算法总结
  • OTA升级
  • 壹嘉情,中国与世界经济文化交流的新桥梁
  • linux-Linux 内核与模块管理-内核模块管理
  • 【SQL】百题计划:SQL对于空值的比较判断。
  • Mac中Twig模版安装与SSTI漏洞学习
  • 【python】30、矩阵加法 tensor.sum
  • 基于DeepCFD模型和CNN/U-Net模型的流场预测
  • 一个简约的uniapp登录界面,基于uniapp+vue3+uview-plus
  • W25QXX系列Flash存储器模块驱动代码
  • 【读论文】End-to-end reproducible AI pipelines in radiology using the cloud
  • Android RecyclerView 缓存机制深度解析与面试题
  • [Vue CLI 3] 配置解析之 css.extract
  • 【css3】浏览器内核及其兼容性
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • Java 最常见的 200+ 面试题:面试必备
  • MQ框架的比较
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • Vue 2.3、2.4 知识点小结
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • vue-router的history模式发布配置
  • webpack4 一点通
  • 百度小程序遇到的问题
  • 从零搭建Koa2 Server
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 欢迎参加第二届中国游戏开发者大会
  • 解析 Webpack中import、require、按需加载的执行过程
  • 前端之React实战:创建跨平台的项目架构
  • 如何用vue打造一个移动端音乐播放器
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 译有关态射的一切
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (03)光刻——半导体电路的绘制
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (不用互三)AI绘画工具应该如何选择
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (每日一问)基础知识:堆与栈的区别
  • (全注解开发)学习Spring-MVC的第三天
  • (三)c52学习之旅-点亮LED灯
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (一)Java算法:二分查找
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • .equals()到底是什么意思?
  • .naturalWidth 和naturalHeight属性,
  • .NET CF命令行调试器MDbg入门(三) 进程控制