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

C学习(数据结构)-->二叉树

目录

一、树

1、概念与结构

 2、相关术语

3、树的表示

孩子兄弟表示法:

 ​编辑​编辑

 二、二叉树

1、概念与结构

2、特殊的二叉树

1)满二叉树

 2)完全二叉树

3、二叉树的存储结构

1)顺序存储

 2)链式结构


一、树

1、概念与结构

树是一种非线性的数据结构,是由 n(n >= 0)个有限结点组成一个具有层次关系的集合。

由于像一棵倒挂的树(根朝上、叶朝下),所以称为 树 。

  • 树有一个特殊结点,称为 根结点 ,它是第一个结点,没有前驱结点
  • 除根结点外,其余结点被分成M(M > 0)个不相交的集合,即T1、T2、.......、Tm。其中、每一个集合又是一棵结构与树类似的子树,且每棵子树的根节点有且只有一个前驱结点,但是可以有0个或多个后继。所以、树是被递归定义的。
  • 子树是不相交的
  • 除了根结点为,每给结点有且仅有一个 父节点 / 双亲结点
  • 一个 N 个结点的树有 N-1条边

 2、相关术语

  •  父结点 / 双亲结点:若一个结点含有子结点,则这个结点称为子结点的父结点,入A是D的父结点,而D又是H的父结点
  • 子结点 / 孩子结点:一个含有子树的结点称为该结点的子结点,如B是A的子结点
  • 结点的度:一个结点有几个子结点,就有几个度
  • 树的度:哪个结点的度最多,那么该结点的度是多少,树的度就是多少
  • 叶子结点 / 终端结点:度为 0 结点称为叶子结点
  • 分支结点 / 非终端结点 :度不为 0 的结点
  • 兄弟结点 :具有相同父结点的结点互称为兄弟结点
  • 结点的层次:从根结点开始,根为第一层,根的子结点为第二层,以此类推
  • 树的高度或深度:树中结点的最大层次
  • 结点的祖先:从根到该结点上的所经过的分支的所有结点,例如:因为A-->E-->J-->Q,所以A、E、J是Q的祖先
  • 路径:一条从树中任意结点出发沿父结点-->子结点连接,达到任意结点的序列,如:A-->Q的路径A-->E-->J-->Q、H-->Q的路径H-->D-->A-->E-->J-->Q
  • 子孙:以某一个结点为根的子树中任一结点都为该结点的子孙
  • 森林:由 m ( m > 0 ) 棵互不相交的树的集合称为森林

3、树的表示

孩子兄弟表示法:

struct TreeNode 
{ struct Node* child; // 左边开始的第⼀个孩⼦结点 struct Node* brother; // 指向其右边的下⼀个兄弟结点 int data; // 结点中的数据域 
};

 

 二、二叉树

1、概念与结构

给树加个限制,就是它的子结点个数最多为2,且称为左子结点和右子结点。即一个二叉树是结点的一个有限集合,由一个根结点加上两棵别称为左子树和右子树的二叉树组成或者为空。

所以,二叉树具备以下特点

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

2、特殊的二叉树

1)满二叉树

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

 2)完全二叉树

完全二叉树是由满二叉树引出来的。对于深度为 K 的,有 n 个结点的二叉树,当且仅当其每一个结点都与度为 K 的满二叉树编号从 1 至 n 的结点一一对应时称之为完全二叉树。

注意:满二叉树是一种特殊的完全二叉树

例如:深度为3,有6个结点的完全二叉树

根据满二叉树的特点可知:

  • 若规定根节点的层数为 1 ,则一棵非空二叉树的第 k 层上最多有 2^k-1 个结点
  • 若规定根节点的层数为 1,则深度为 h 的二叉树的最大结点数是 2^h-1
  • 若规定根节点的层数为 1,具有 n 个结点的满二叉树的深度 h = log2(n+1)(log以2为底,n+1为对数)

3、二叉树的存储结构

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

1)顺序存储

顺序结构的存储使用数组来存储,一个使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间浪费

 

一般把堆(一种二叉树)使用顺序结构的数组来存储,要注意的是,这里的堆和操作系统虚拟进程地址空间中的堆是两回事,这里的堆是指数据结构

 2)链式结构

二叉树的链式结构是指,用链表来表示一棵二叉树,即用链表来表示元素的逻辑关系。链表的每个结点通常由三个域表示,数据域和左右指针域,左右指针分别用来给出结点左孩子和右孩子所在链结点的存储地址。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • SpringBoot依赖之Spring Data Redis 实现地理坐标(Geospatial)
  • 响应式Web设计:纯HTML和CSS的实现技巧-1
  • Java 入门指南:注解(Annotation)
  • Linux系统下的容器安全:深入解析与最佳实践
  • 《AI办公类工具PPT系列之三——Gamma APP》
  • appium下载及安装
  • .NET开源纪元:穿越封闭的迷雾,拥抱开放的星辰
  • vue3-基础
  • 从零开始学cv-5: 图像的仿射变换
  • FlinkCEP - Flink的复杂事件处理详解
  • 推荐使用阿贝云免费云服务器、免费虚拟主机
  • docker GBase 8sV8.8使用的常见错误
  • pip出问题了,重装,获取python3.7 get-pip.py
  • python(7) : Windows守护python程序
  • 《Cloud Native Data Center Networking》(云原生数据中心网络设计)读书笔记 -- 07数据中心的边缘
  • 【391天】每日项目总结系列128(2018.03.03)
  • ECMAScript入门(七)--Module语法
  • GitUp, 你不可错过的秀外慧中的git工具
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • js写一个简单的选项卡
  • mysql常用命令汇总
  • Quartz初级教程
  • React系列之 Redux 架构模式
  • V4L2视频输入框架概述
  • Web Storage相关
  • 翻译:Hystrix - How To Use
  • 机器学习学习笔记一
  • 深度学习入门:10门免费线上课程推荐
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 在Mac OS X上安装 Ruby运行环境
  • Hibernate主键生成策略及选择
  • 移动端高清、多屏适配方案
  • (02)Hive SQL编译成MapReduce任务的过程
  • (1)SpringCloud 整合Python
  • (C11) 泛型表达式
  • (c语言)strcpy函数用法
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (篇九)MySQL常用内置函数
  • (循环依赖问题)学习spring的第九天
  • (游戏设计草稿) 《外卖员模拟器》 (3D 科幻 角色扮演 开放世界 AI VR)
  • (转)为C# Windows服务添加安装程序
  • (转)项目管理杂谈-我所期望的新人
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • .dwp和.webpart的区别
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .NET Core中如何集成RabbitMQ
  • .net framework 4.0中如何 输出 form 的name属性。
  • .Net 应用中使用dot trace进行性能诊断
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .NET处理HTTP请求
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • .NET连接数据库方式
  • .NET序列化 serializable,反序列化