二叉树的概念、存储及遍历

一、二叉树的概念

        1、二叉树的定义

        二叉树( binary tree)是 n 个结点的有限集合,该集合或为空集(空二叉树),或由一个根结点与两棵互不相交的,称为根结点的左子树、右子树的二叉树构成。

        二叉树的特点是:

        (1)每个结点最多有两棵子树,故二叉树中不存在度大于 2 的结点。
        (2)二叉树是有序的,其次序不能任意颠倒,即使树中的某个结点只有一棵子树,也要区分它是左子树还是右子树。
         二叉树具有以下 5 种基本形态:

1、

        2、特殊的二叉树

        在实际应用中,常会用到以下几种特殊的二叉树。

        1.斜树

        所有的结点都只有左子树的二叉树称为左斜树,所有的结点都只有右子树的二叉树称为右斜树,在斜树中,每层只有一个结点,因此斜树的结点个数与其深度相同.

        2.满二叉树

        在一棵二叉树中,若所有的分支结点都存在左子树和右子树,且所有的叶子都在同一层上,则称为满二叉树

其特点是:

  • 叶子只能出现在最下一层
  • 只有度为 0、度为 2 的结点

        由于满二叉树的特性可知:满二叉树在同样深度的二叉树中结点个数、叶结点个数最多。

      3.完全二叉树


      对一棵具 n 个结点的二叉树按层序编号,若编号为 i 的结点与同样深度的满二叉树中编号 i 的结点在二叉树中的位置完全相同,则称为完全二叉树,那么显然有:满二叉树是完全二叉树

      其特点是:

      (1)若i ≤ n / 2, 则结点i为分支结点,否则为叶子结点。
      (2)叶子结点只可能在层次最大的两层上出现。对于最大层次中的叶子结点,都依次排列在该层最左边的位置上。
      (3)若有度为1的结点,则只可能有一个,且该结点只有左孩子而无右孩子(重要特征)。
      (4)按层序编号后,一旦出现某结点(编号为i)为叶子结点或只有左孩子,则编号大于i 的结点均为叶子结点。
      (5)若n为奇数,则每个分支结点都有左孩子和右孩子;若n为偶数,则编号最大的分支结点(编号为n / 2 )只有左孩子,没有右孩子,其余分支结点左、右孩子都有。

简单来说,在满二叉树中,从最后一个结点开始,连续去掉任意个的结点,即是一棵完全二叉树

3、二叉树的性质
 

        1.非空二叉树的第 i 层上行最多有 2^{i-1}(i\geqslant 1) 个结点

        2.在一棵深度为 k 的二叉树中,最多有 2^{k}-1 个结点,最少有 k 个结点

推论:深度为 k 且具 2^{k}-1 个结点的二叉树一定是满二叉树,但深度为 k 具有 k 个结点的二叉树不一定是斜树

       3.任意一棵树,若结点数量为n ,则边的数量为n − 1 。

       4.在一棵二叉树中,若叶结点个数为 n_0,度为 2 结点个数为 n_2,那么有:n_0=n_2+1

       5.具有 n 个结点的完全二叉树的深度为 \left \lfloor log_2\:n \right \rfloor +1 ,

       6.对完全二叉树按从上到下、从左到右的顺序依次编号1 , 2,...,n,则有以下关系:
              (1)若 i=1,则:结点 i 为根节点;若 i>1,则:结点 i 的父结点编号为 i / 2,即当i 为偶数时, 它是双亲的左孩子;当i为奇数时,它是双亲的右孩子。
              (2)若2 i ≤ n 时,结点i 的左孩子编号为2 i , 否则无左孩子。

              (3)若2 i + 1 ≤ n 时,结点i 的右孩子编号为2 i + 1 ,否则无右孩子。

              (4)结点i 所在层次(深度)为 \left \lfloor log_2\:n \right \rfloor +1

4、二叉树的存储结构

      1、顺序存储结构

        二叉树的顺序存储结构是用一维数组存储二叉树中的结点,并用结点的存储位置表示结点间的逻辑关系(父子关系)

        由于二叉树本身不具有顺序关系,因此二叉树的顺序存储结构要解决的关键问题是如何利用数组下标来反映结点间的逻辑关系。

        由于完全二叉树中结点的层序编号可以唯一反映结点间的逻辑关系,因此对于一般的二叉树,可以添加一些不存在的空结点,使其成为一棵完全二叉树,再利用一维数组存储。

        具体步骤为:

        1、根节点编号为 1
        2、若某结点 i 有左孩子,则其左孩子编号为 2i
        3、若某结点 i 有右孩子,则其右孩子编号为 2i+1


缺陷:顺序存储会造成存储空间的浪费,最坏的情况是右斜树,一棵深度为 k 的右斜树,却要分配 2^k-1 个存储空间。

因此,二叉树的顺序存储结构一般仅用于存储完全二叉树

2、链式存储结构

      既然顺序存储适用性不强,我们就要考虑链式存储结构。二叉树每个结点最多有两个孩子,所以为它设计一个数据域和两个指针域是比较自然的想法,我们称这样的链表叫做二叉链表

lchilddatarchild

        其中data是数据域,lchild 和rchild都是指针域,分别存放指向左孩子和右孩子的指针。
以下是我们的二叉链表的结点结构定义代码。

/*二叉树的二叉链表结点构造定义*/
/*结点结构*/
struct BiTNode{TElemType data;	//结点数据BiTNode *lchild, *rchild;	//左右孩子指针
} BiTNode, *BiTree;  //根结点

容易验证,在含有n 个结点的二叉链表中,含有n + 1 个空链域。


二、遍历二叉树

        二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次。

1、先序遍历

先序遍历(PreOrder) 的操作过程如下:若二叉树为空,则什么也不做,否则,
1)访问根结点;
2)先序遍历左子树;
3)先序遍历右子树。

2、中序遍历

中序遍历( InOrder)的操作过程如下:若二叉树为空,则什么也不做,否则,
1)中序遍历左子树;
2)访问根结点;
3)中序遍历右子树。

3、后序遍历

后序遍历( InOrder)的操作过程如下:若二叉树为空,则什么也不做,否则,
1)中序遍历左子树;
2)中序遍历右子树。
3)访问根结点;

        三种遍历算法中,递归遍历左、右子树的顺序都是固定的,只是访问根结点的顺序不同。不管采用哪种遍历算法,每个结点都访问一次且仅访问一次,故时间复杂度都是O(n)。在递归遍历中,递归工作栈的栈深恰好为树的深度,所以在最坏情况下,二叉树是有n个结点且深度为n的单支树,遍历算法的空间复杂度为O(n)。
 

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

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

相关文章

C语言开发手册,辅助工具

方便查函数,头文件,日常语法,c99与c11的差异,等 https://www.php.cn/manual/view/34866.html

【JDK 8-函数式编程】4.6 方法引用与构造函数引用

一、 方法引用与构造函数引用 1. 说明 2. 语法: 二、静态方法 三、实例方法 四、构造函数 4.1 单个参数 4.2 2个参数 五、执行结果 一、 方法引用与构造函数引用 以前调用:对象.方法名、类名.方法名 jdk1.8提供了另外一种调用方式 :: 1. 说明 用来直接访…

分布式缓冲-搭建主从架构

个人名片: 博主:酒徒ᝰ. 个人简介:沉醉在酒中,借着一股酒劲,去拼搏一个未来。 本篇励志:三人行,必有我师焉。 本项目基于B站黑马程序员Java《SpringCloud微服务技术栈》,SpringCloud…

上海长宁来福士P2.5直径4米无边圆形屏圆饼屏圆面屏圆盘屏平面圆屏异形创意LED显示屏案例

长宁来福士广场是一个大型广场,坐落于上海中山公园商圈的核心区域,占地逾6万平方米,其中地上总建筑面积近24万平方米,总投资额约为96亿人民币。 LED圆形屏是根据现场和客户要求定制的一款异形创意LED显示屏,进行文字、…

WPF中DataGrid控件绑定数据源

步骤 创建数据源:首先,我们需要创建一个数据源,可以是一个集合(如List、ObservableCollection等),也可以是一个DataTable对象。数据源中的每个元素代表一行数据。 设置DataGrid的ItemsSource属性&#xff…

Linux集群时间同步方法

参考:https://www.cnblogs.com/felixzh/p/10638399.html

Dockerfile

Dockerfile Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。 更新详细语法说明,请参考官网文档: Dockerfile reference | Docker Docs D…

JVM执行流程

一、Java为什么是一种跨平台的语言? 通常,我们编写的java源代码会被JDK的编译器编译成字节码文件,再由JVM将字节码文件翻译成计算机读的懂得机器码进行执行;因为不同平台使用的JVM不一样,所以不同的JVM会把相同的字节码…

以神龙出行小程序为例,说一些网站技术

注册和登录功能: 用户注册和登录可以使用手机号验证、第三方登录等方式来实现。这需要与后台服务器进行数据交互,并进行身份验证。 数据存储和管理: 用户的个人信息和常用地址需要进行存储和管理。这可以通过数据库来实现,如关系…

【分布式】分布式事务:2PC

分布式事务的问题可以分为两部分: 并发控制 concurrency control原子提交 atomic commit 分布式事务问题的产生场景:一份数据被分片存在多台服务器上,那么每次事务处理都涉及到了多台机器。 可序列化(并发控制)&…

每日一题 337. 打家劫舍 III

难度:中等 整体思路相当于是前两天的方法倒过来,毕竟二叉树最常用的解法就是递归倒推 对于每一颗子树,他必定有一种最大的盗取方法,但是只有它的 root 的盗取情况才会影响到 root 的父节点,即如果收益最大的盗取方法…

图像处理:双边滤波

1. 双边滤波 公式含义: q:输入的像素点,它代表上图中55的方框中其中的一个像素点 : 空间域核 : 图像像素域核 (两个二维高斯函数,二维高斯函数的公式为:) 进行了一些小的改动,让他们更加符合我们的要求&#xff0…

【每日一题】1146. 快照数组

1146. 快照数组 - 力扣(LeetCode) 实现支持下列接口的「快照数组」- SnapshotArray: SnapshotArray(int length) - 初始化一个与指定长度相等的 类数组 的数据结构。初始时,每个元素都等于 0。void set(index, val) - 会将指定索引…

【去除若依首页】有些小项目不需要首页,去除方法

第一步 // // // // // // // // // // // // // // // // // // 修改登录页 Login.vue 中 大概144行 ,注释掉原有跳转。替换为自己的跳转路径 // // // // // // // // // // // // // this.$router.push({ path: this.redirect || …

linux 设置打开文件数

可以使用下面的文件进行设置 /etc/security/limits.d/90-nproc.conf 先来看/etc/security/limits.d/90-nproc.conf 配置文件: [root ~]# cat /etc/security/limits.d/90-nproc.conf # Default limit for number of users processes to prevent # accidental fork…

TikTok矩阵玩法:如何最大程度地利用平台资源

在数字时代,TikTok已经成为全球范围内数亿用户的创意天堂,不仅仅是一个娱乐平台,还是一个创收的宝地。 TikTok矩阵玩法的崛起正在引领创作者们探索全新的变现方案,他们通过巧妙地利用平台资源,实现了前所未有的创收机…

李宏毅hw-6利用GAN生成动漫图像

一、查漏补缺、熟能生巧: 1.什么是转置卷积convTranspose、以及这种转置卷积怎么使用: (1)具体的原理直接看李沐老师的那个演示,非常清晰: 47 转置卷积【动手学深度学习v2】_哔哩哔哩_bilibili &#x…

从字符串中删除指定字符

任务描述 编写一个函数实现功能:从字符串中删除指定的字符。同一字母的大、小写按不同字符处理。例如:程序执行时输入字符串:turbo c and Borland c,从键盘输入字符n,则输出后变为:turbo c ad Borlad c。如…

【Java】全套云HIS(医院信息管理系统)源码包含EMR、LIS

云HIS系统简介 SaaS模式Java版云HIS系统源码,在公立二甲医院应用三年,经过多年持续优化和打磨,系统运行稳定、功能齐全,界面布局合理、操作简便。 1、融合B/S版电子病历系统,支持电子病历四级,HIS与电子病…

爬虫 — 验证码反爬

目录 一、超级鹰二、图片验证模拟登录1、页面分析1.1、模拟用户正常登录流程1.2、识别图片里面的文字 2、代码实现 三、滑块模拟登录1、页面分析2、代码实现(通过对比像素获取缺口位置) 四、openCV1、简介2、代码3、案例 五、selenium 反爬六、百度智能云…