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

二叉树详解-第一篇 树以及二叉树的概念

目录

​编辑

1.树的概念及结构

1.1树的概念

1.2树的特点

1.3树的相关概念

1.4树的表示

2.二叉树的概念及结构

2.1二叉树的概念

2.2特殊二叉树-满二叉树和完全二叉树

1.满二叉树的概念及性质

2.完全二叉树的概念及性质

2.3二叉树的性质(重点)

2.4二叉树的存储

1.顺序存储:

2.链式存储


1.树的概念及结构

1.1树的概念

        树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成的一个具有参差关系的集合,把它叫做树是因为看起来像一倒挂的树,根在上,叶子在下。其中有一个特殊的节点,称为根节点,根节点没有前驱结点。

如图:

1.2树的特点

        树形结构中,子树之间不能有交集,否则就不是属树形结构。

        子树是不相交的。

        除了根节点之外,每个节点有且仅有一个父节点。

        一颗N个节点的树有N-1条边。

1.3树的相关概念

加粗要重点记忆!

节点的度:一个节点的出度为该节点的度。

叶节点或终端节点:度(出度)为0的节点。

非终端节点或分支节点:度(出度)不为0的节点。

双亲结点或父节点:若该结点有子节点,则该节点为子节点的父节点。

孩子节点或子节点:根节点的孩子为孩子结点。

兄弟结点:具有相同父节点的结点互相称为兄弟节点。

树的度:一棵树中,所有节点中节点度最大的度称为树的度。

节点的层次:从根开始,根为第一层,根的子节点为第二层,......。

树的高度或深度:树中所有结点的最大层次;

堂兄弟结点:在同一层的结点,但是不同父节点的结点。

森林:n棵互不相交的树的集合为森林。

1.4树的表示

        树的表示,既要保存值,又要保存结点和结点之间的关系。树有很多种表示方法:双亲表示法。孩子表示法,孩子双亲表示法,以及孩子兄弟表示法。我这里主要讲孩子兄弟表示法(左孩子右兄弟表示法)。

已知树的度为N

struct TreeNode
{int val;struct TreeNode* num[N];
};

未知树的度

struct TreeNode
{int val;Seqlist num;//动态顺序表num中存储 struct TreeNode*
};

左孩子右兄弟表示法(重点)

struct TreeNode
{int val;struct TreeNode* leftchild;struct TreeNode* rightbrother;
};


2.二叉树的概念及结构

2.1二叉树的概念

二叉树为树的子集,度最大为二(每个节点最多有两个孩子,左孩子,右孩子),且二叉树的子树有左右之分,不能颠倒,所以二叉树为有序树。

以下都属于二叉树:

2.2特殊二叉树-满二叉树和完全二叉树

1.满二叉树的概念及性质

满二叉树:一个二叉树中,每一层的结点数都达到了最大值,则这个二叉树为吗,满二叉树。

性质:

满二叉树的节点总数为 2^{k}-1。(k为二叉树层数)。

层数为 k=\log_{2}(k+1)

叶子节点数量 2(k-1)

2.完全二叉树的概念及性质

完全二叉树:一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。(前k-1层都是满的,最后一层不满,但是从左到右必须是连续的)

性质:

具有n个结点的完全二叉树的深度

满二叉树肯定是完全二叉树,而完全二叉树不一定是满二叉树。

2.3二叉树的性质(重点)

1.若规定根节点的层数为1,则一颗非空二叉树的第i层上最多有2^{i-1}个节点.

2.若规定根节点的层数为1,则深度为k的二叉树的最大结点数为2^{h}-1.

3.对任何一颗二叉树,度为0的叶节点数为n{_{0}}^{},度为2的分支节点数为n{_{2}}^{},则有n{_{0}}^{}=n{_{2}}^{}+1

2.4二叉树的存储

二叉树的存储有两种,一种是顺序存储,一种是链式存储。

1.顺序存储:

顺序存储就是使用数组来存储,非常适用于满二叉树和完全二叉树,若是其他数,则会有空间的浪费。二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树。

用下标计算父子关系:

假设已知父亲下标为i,则左孩子的下标为2*i+1,则右孩子的下标为2*i+2

假设孩子在数组中的下标为j,则父亲下标为(j-1)/2

因为:若为左孩子则父亲下标为(j-1)/2,若为右孩子则父亲下标为(j-2)/2,又因为(j-jishu)/2=(j-oushu)/2,则统一为(j-1)/2;

2.链式存储

用链表来表示一棵二叉树,通常方法是链表中每个节点由三个域组成,数据域和左右指针域,左右指针分别用来给出该节点左孩子和右孩子所在节点的存储地址,链式存储又分为二叉链和三叉链,我们一般学习二叉链,三叉链一般用于红黑树。

//二叉链
struct TreeNode
{int val;//值struct TreeNode* left;//左孩子struct TreeNode* right;//右孩子
};//三叉链
struct TreeNode
{int val;//值struct TreeNode* left;//左孩子struct TreeNode* right;//右孩子struct TreeNode* parent;//当前节点的双亲
};


本篇完。 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Golang | Leetcode Golang题解之第273题整数转换英文表示
  • mongoose之http调试代码
  • 星环科技推出知识库产品 AI PC时代数据交互方式变革
  • 【开发实战】QT5 + OpenCV4 开发环境配置应用演示
  • js-vue中多个按钮状态选中类似于复选框与单选框实现
  • 硅纪元视角 | 语音克隆突破:微软VALL-E 2,Deepfake新纪元!
  • 夏老师小课堂(15)丨空心杯电机基础入门(上海鸣志电器)
  • 【Go系列】Go的UI框架GIO
  • SpringBoot集成Tomcat、DispatcherServlet
  • 【监控软件】Zabbix
  • 【Langchain大语言模型开发教程】基于文档问答
  • 太原高校大学智能制造实验室数字孪生可视化系统平台建设项目验收
  • 基于区块链技术的高校教育资源共享的研究
  • Animate.css的使用
  • 视图,存储过程和触发器
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 「面试题」如何实现一个圣杯布局?
  • Javascript Math对象和Date对象常用方法详解
  • jquery ajax学习笔记
  • JS题目及答案整理
  • Python中eval与exec的使用及区别
  • quasar-framework cnodejs社区
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 动态规划入门(以爬楼梯为例)
  • 复习Javascript专题(四):js中的深浅拷贝
  • 力扣(LeetCode)21
  • 配置 PM2 实现代码自动发布
  • 使用 QuickBI 搭建酷炫可视化分析
  • 异步
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 找一份好的前端工作,起点很重要
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • Java数据解析之JSON
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • ​【已解决】npm install​卡主不动的情况
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • $ git push -u origin master 推送到远程库出错
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (007)XHTML文档之标题——h1~h6
  • (09)Hive——CTE 公共表达式
  • (10)ATF MMU转换表
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (十一)c52学习之旅-动态数码管
  • (十一)图像的罗伯特梯度锐化
  • (转) ns2/nam与nam实现相关的文件
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • .NET 8.0 发布到 IIS
  • .Net mvc总结
  • .NET命名规范和开发约定
  • /etc/fstab 只读无法修改的解决办法
  • :如何用SQL脚本保存存储过程返回的结果集