树和二叉树(一)

一、树

      非线性数据结构,在实际场景中,存在一对多,多对多的情况。

 

树( tree)是n (n>=0)个节点的有限集。当n=0时,称为空树。

在任意一个非空树中,有如下特点。

1.有且仅有一个特定的称为根的节点。

2.当n>1时,其余节点可分为m (m>0)个互不相交的有限集,每一个集合本身又是一个树,并称为根的子树。 

如图所示:节点1:根节点(root),节点5,6,7,8:叶子节点(leaf);分为不同的层级,节点4是父节点(parent),节点4的孩子节点(child)节点4的兄弟节点(sibling);

 

树的最大的层级树,称为数的高度或深度,上图的数的高度为4。 

二、 二叉树

     二叉树(binary tree)是树的一种特殊形式。二叉顾名思义,这种树的每个节点最多有2个孩子节点

   注意:这里是最多有2个,也可能只有1个,或者没有孩子节点。 

 

二叉树节点的两个孩子节点,一个被称为左孩子(leftchild) ,一个被称为右孩子(right child)。

此外,二叉树还有两种特殊形式,一个叫作满二叉树,另一个叫作完全二叉树

2.1、二叉树的五种基本形式: 

2.2、二叉树与树的区别 :

  • 树中结点的最大度数没有限制,而二叉树结点的最大度数为2
  • 树的结点无左、右之分,而二叉树的结点有左、右之分

2.3、满二叉树与完全二叉树:

(1)满二叉树

     一个二叉树的所有非叶子节点都存在左孩子和右孩子,并且所有叶子节点都在同一层级上,那么这个树就是满二叉树。 

简单点说,满二叉树的每一个分支都是满的。


 

 (2)完全二叉树

     对一个有n个节点的二叉树,按层级顺序编号,则所有节点的编号为从1到n。如果这个树所有节点和同样深度的满二叉树的编号为从1到n的节点位置相同,则这个二叉树为完全二叉树。

 

     在上图中,二叉树编号从1到12的12个节点,和前面满二叉树编号从1到12的节点位置完全对应。因此这个树是完全二叉树。 

      完全二叉树的条件没有满二叉树那么苛刻:满二叉树要求所有分支都是满的;而完全二叉树只需保证最后一个节点之前的节点都齐全即可。  

三、二叉树的性质 

1、在二叉树的第 i 层上最多有 2^n-1个结点(i>=1) 

2、深度(高度)为 k 的二叉树最多有 2^k - 1个结点(k>=1)

 

3、对任意一颗二叉树,如果其叶子节点数为 N0,度为2的结点数为N2,则 N0 = N2 + 1 

设 : 结点之间的总连线数是B ,总结点数是n,
        度为0的结点是n0,
        度为1的结点是n1,
        度为2的结点是n2, 

      从上往下看 二叉树最大的度就是2所以的节点要么度是2,要么度是1,要么度是0,度是2的会发出两条线, 度是1的发出1条线所以得到图片里的公式 B = n2 * 2 + n1;

二叉树的总结点数 n = n1 +n2+n0;

总连续数 B=n-1

 

由此得出:度是0的结点个数=度是2的结点个数+1

四、二叉树的存储

1.链式存储结构

2.数组

 (1)链式存储结构

  

  • 存储数据的data变量
  • 指向左孩子的left指针
  • 指向右孩子的right指针

(2)数组

        使用数组存储时,会按照层级顺序把二叉树的节点放到数组中对应的位置上。如果某一个节点的左孩子或右孩子空缺,则数组的相应位置也空出来。

 如何方便地在数组中定位二叉树的孩子节点和父节点?

     假设一个父节点的下标是parent,

     左孩子节点的下标=2xparent +1;

     右孩子节点的下标=2xparent+2。

由此:

     如果一个左孩子节点的下标是leftChild,那么它的父节点下标=(leftChild-1)/2。

     如果一个右孩子节点的下标是rightChild,那么它的父节点下标=(rightChild-2)/2。

  

 图上所示, 节点5的索引是4,那么节点5的父节点=(4-2)/2=1,由此可得索引1对应的是节点2

五、二叉树的遍历

  1. 深度优先遍历
  2. 广度优先遍历

1. 深度优先遍历
    深度优先( depth first search,DFS ) ,顾名思义就是偏向于纵深,“一头扎到底”的访问方式。深度优先遍历又根据遍历顺序的不同分为三种:前序遍历、中序遍历、后序遍历

1.1 前序遍历
所谓前序遍历,是指二叉树遍历每个子树的时候,都是按照根结点、左子树、右子树的顺序来遍历,因为根结点在前,所以叫做前序遍历。前序遍历中根结点的优先级别最高。如下图所示:

1.2 中序遍历

如果二叉树遍历每个子树的时候,都是按照左子树、根结点、右子树的顺序来遍历,因为根结点在中间,所以叫做中序遍历。如下图所示:

1.3 后序遍历

二叉树遍历每个子树的时候,都是按照左子树、右子树、根结点的顺序来遍历,因为根结点在最后,所以叫做后序遍历。如下图所示:

 使用递归的方式来操作,如图所示

''''树节点'''
class TreeNode:'''初始化'''def __init__(self,data):self.data=data #数据self.left=None #左节点self.right=None #右节点'''二叉树'''
class MyTree:def create_tree(self,input_list=[]):#判断数列是否为空if input_list is None or len(input_list)==0:return None#第一个出队data=input_list.pop(0)#判断数据为空if data is None:return None#树节点node=TreeNode(data)#创建左节点node.left=self.create_tree(input_list)#创建右节点node.right =self.create_tree(input_list)return nodedef before_foreach(self,node):'''前序遍历  (根左右):param node:  二叉树节点:return:'''# 判断节点为空if node is None:return None#显示节点数据print(node.data,end=',')#再次遍历左节点,右节点self.before_foreach(node.left)self.before_foreach(node.right)return nodedef middle_foreach(self,node):'''中年序遍历  (左根右):param node:  二叉树节点:return:'''# 判断节点为空if node is None:return None#再次遍历左节点self.middle_foreach(node.left)# 显示节点数据print(node.data, end=',')# 再次遍历右节点self.middle_foreach(node.right)return nodedef after_foreach(self,node):'''后序遍历  (左右根):param node:  二叉树节点:return:'''# 判断节点为空if node is None:return None#再次遍历左节点,右节点self.after_foreach(node.left)self.after_foreach(node.right)# 显示节点数据print(node.data, end=',')return nodeif __name__ == '__main__':#二叉树对象my=MyTree()#列表ll=list([5,6,8,None,None,10,None,None,9,None,7])#调用方法node=my.create_tree(input_list=ll)print('前序遍历')my.before_foreach(node)print('\n中序遍历')my.middle_foreach(node)print('\n后序遍历')my.after_foreach(node)

 

 2. 广度优先遍历

     广度优先遍历( Breadth First Search,BFS )也叫层序遍历,就是按照二叉树中的层次从左到右依次遍历每层中的结点。层序遍历的实现思路是利用队列来实现

     先将树的根结点入队,然后再让队列中的结点出队。队列中每一个结点出队的时候,都要将该结点的左子结点和右子结点入队。当队列中的所有结点都出队,树中的所有结点也就遍历完成。此时队列中结点的出队顺序就是层次遍历的最终结果。如下图所示:

 

(1) 根节点1入队列

 

(2) 节点1出队,输出节点1,并得到节点1的左孩子节点2、右孩子节点3。让节点2和节点3入队。

(3) 节点2出队,输出节点2,并得到节点2的左孩子节点4、右孩子节点5。让节点4和节点5入队。

(4) 节点3出队,输出节点3,并得到节点3的右孩子节点6。让节点6入队。

 

(5)节点4出队,输出节点4,由于节点4没有孩子节点,所以没有新节点入队。

(6)节点5出队,输出节点5,由于节点5同样没有孩子节点,所以没有新节点入队。

 

(7) 节点6出队,输出节点6,节点6没有孩子节点,没有新节点入队。

  使用递归的方式来操作,如上图所示

'''节点'''
class TreeNode:'''初始化数据'''def __init__(self, data):self.data = dataself.left = Noneself.right = None'''层序遍历'''
def level_order_traversal(root):# 判断节点为空if root is None:return []#数列result = []#队列queue = [root]#循环while queue:level = []  #层列#循环for _ in range(len(queue)):#第一个数据出队列node = queue.pop(0)#添加数据level.append(node.data)#判断左节点是否不为空if node.left is not None:queue.append(node.left)# 判断左节点是否不为空if node.right is not None:queue.append(node.right)#添加到列表中result.append(level)return resultif __name__ == '__main__':#二叉树对象root = TreeNode(1)root.left = TreeNode(2)root.right = TreeNode(3)root.left.left = TreeNode(4)root.left.right = TreeNode(5)root.right.right = TreeNode(6)print(level_order_traversal(root))

 

    在实际应用中,二叉树又是使用最广泛的,特别是二叉树的几种遍历操作的规则,需要重点掌握。在面试或应试中,通常会根据前序、中序、后序中的两种序列,询问另外一种树的遍历结果。

 

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

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

相关文章

ELK日志分析系统之Kafka

目录 一、消息队列基本介绍 1、为什么需要消息队列(MQ) 2、使用消息队列的好处 1.解耦 2.可恢复性 3.缓冲 4.灵活性 & 峰值处理能力 5.异步通信 3、Kafka消息队列的两种模式 1.点对点模式 2.发布/订阅模式 二、Kafka基本介绍 1、Kafka定义 2、Kafka概念 3、…

SSRF靶场

SSRF概述 ​ 强制服务器发送一个攻击者的请求 ​ 互联网上的很多web应用提供了从其他服务器(也可以是本地)获取数据的功能。使用用户指定的URL,web应用可以获取图片(载入图片)、文件资源(下载或读取)。如下图所示&…

【Blockchain】连接智能合约与现实世界的桥梁Chainlink

去中心化预言机试图实现依赖因果关系而不是个人关系的去信任和确定性结果。它以与区块链网络相同的方式实现这些结果,即在许多网络参与者之间分配信任。通过利用许多不同的数据源并实施不受单个实体控制的预言机系统,去中心化的预言机网络有可能为智能合…

阿里云优惠券使用方法图解_优惠券免费领取入口

2024年最新阿里云优惠代金券领取入口,阿里云服务器优惠代金券、域名代金券,在领券中心可以领取当前最新可用的满减代金券,阿里云百科aliyunbaike.com分享阿里云服务器代金券、领券中心、域名代金券领取、代金券查询及使用方法,可以…

第11章 数据仓库和数据智能知识点梳理

第11章 数据仓库和数据智能知识点梳理(附带页码) ◼ 数据仓库(Data Warehouse,DW):始于 20 世纪 80 年代,发展于 20 世纪 90 年代,后与商务智能(Business Inteligence,BI…

jenkins下载安装(mac)

下载官网 直接命令安装 Sample commands: Install the latest LTS version: brew install jenkins-ltsStart the Jenkins service: brew services start jenkins-ltsRestart the Jenkins service: brew services restart jenkins-ltsUpdate the Jenkins version: brew upgrade …

Linux 安装KVM虚拟机

什么是KVM虚拟机? KVM 是 Kernel-based Virtual Machine 的缩写,是一种用于虚拟化的开源硬件虚拟化技术。它使用 Linux 内核的虚拟化模块,将物理服务器划分为多个虚拟机。KVM 允许虚拟机直接访问物理硬件资源,从而提供出色的性能和稳定性,同…

WARNING: No swap limit support——查看docker状态时提示警告

环境:Ubuntu 20.04 1、警告详情 执行命令 service docker status如下图 2、解决办法 2.1 修改文件 执行命令 vim /etc/default/grub在GRUB_CMDLINE_LINUX中追加cgroup_enablememory swapaccount1,如下: # If you change this file…

【六】fastapi+vue前后端分离项目

前端代码 https://gitee.com/feiminjie/helloworldfront 后端代码 https://gitee.com/feiminjie/helloworld 整体效果 首页 用例管理页 用例详情页

GPT 浅析

GPT 浅析 文章目录 GPT 浅析GPT 1无监督预训练有监督微调任务相关的输入变换 GPT2GPT3 GPT 1 在模型架构上,GPT-1基于Transformer构造,这是因为与其他卷积神经网 络或者循环神经网络相比,Transformer提供了效率更高的方法来处理文本 中的长期…

几年前删除的照片如何恢复?5步操作,快速找回iPhone照片

“去年三月份参加了社区的志愿者活动拍了好几张照片,近期学校组织我申报市级优秀学生需要我的参加志愿者的照片当材料,但是照片在一年前就删掉了。删除的时间比较久,各位有没有什么方法可以恢复苹果手机的照片?” 在使用苹果手机的…

rk3588 安卓调试

rknn装上了android系统,用type-c usb连接上电脑,设备管理器发现了rk3588,但是Android Studio没有发现设备 后来怀疑是驱动没有安装,我用的驱动下载地址: 瑞芯微Rockchip驱动安装助手(适用于RK3308 RK3399等) Mcuzone…

还有同学开题报告没写吗?

引言 作为一名在软件技术领域深耕多年的专业人士,我不仅在软件开发和项目部署方面积累了丰富的实践经验,更以卓越的技术实力获得了🏅30项软件著作权证书的殊荣。这些成就不仅是对我的技术专长的肯定,也是对我的创新精神和专业承诺…

【智能算法】鸭群算法(DSA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2021年,Zhang等人受到自然界鸭群觅食行为启发,提出了鸭群算法(Duck Swarm Algorithm, DSA)。 2.算法原理 2.1算法思想 DSA基于自然界鸭群觅食过程&…

matplotlib手动调用默认配色

matplotlib 画图有个默认配色方案,在画不同图时会保持一致。如: import numpy as np import matplotlib.pyplot as plt# 图 1 数据 x np.arange(12).astype(np.float32) 1 y1 np.log(x) y2 1 / x y3 np.sin(x) # 图 2 数据 a np.random.randn(200…

十万栋BIM建筑同屏加载!AMRT3D引擎领跑,强力赋能数字孪生

AMRT3D数字孪生引擎https://www.amrt3d.com/#/ AMRT3D是让用户轻松搭建智慧城市、智慧工厂、CIM系统等类型应用的轻量化图形引擎,通过基于自主研发三维底层技术支持,可以让数字化、可视化项目轻松运行在Web等多平台。 它提供了百余种3D功能,…

公园高速公路景区校园IP网络广播音柱SIP音柱

公园高速公路景区校园IP网络广播音柱SIP音柱 适用于学校、车站、教堂、工厂、仓库、公园停车场及露天市场高速公路等场所播放录制语音文件或背景音乐节目,专业一体化音箱设计,高强度防水设计,符合IP54防护等认证,数字化产品&…

C++设计模式|创建型 2.工厂模式

1.简单工厂思想 简单工厂模式不属于23种设计模式之⼀,更多的是⼀种编程习惯。它的核心思想是将产品的创建过程封装在⼀个⼯⼚类中,把创建对象的流程集中在这个⼯⼚类⾥⾯。卡码网将其结构描述为下图所示的情况: 简单⼯⼚模式包括三个主要⻆⾊…

docker安装并跑通QQ机器人实践(2)-签名服务器bs-qsign搭建

在前文中,我们详尽阐述了QQ机器人的搭建过程及其最终实现的各项功能展示。接下来,我们将转向探讨该项目基于Docker构建服务的具体实践。本篇将以QQ机器人签名服务——qsign为起点,逐步展开论述。 1 获取和运行 xzhouqd/qsign:8.9.63 镜像 1.…

社交媒体数据恢复:YY语音

YY语音数据恢复指南 在我们的日常生活中,数据丢失是一种常见的现象。有时候,我们可能会不小心删除了重要的文件,或者因为硬件故障而导致数据丢失。在这种情况下,数据恢复软件可以帮助我们找回丢失的数据。本文将重点介绍如何使用Y…