二叉树的性质和实现

树和二叉树的定义和实现 摘要:树与二叉树数据结构详解 树是由结点构成的层次结构,含根结点及若干互不相交的子树。关键概念包括结点的度、叶子结点、层次等。二叉树是每个结点最多有两棵子树的有序树,子树分左右且次序重要。满二叉树和完全二叉树是两种特殊形式,前者结点数达最大值,后者结点与满二叉树编号一一对应。二叉树具有特定性质,如第i层最多有2^(i-1)个结点,叶子结点数n0 = 度为2的结点数n2 + 1。 实现上,二叉树可采用顺序存储(仅适合完全二叉树)或链式存储(常用)。链式结构通过递归实现前序、中序和后序遍历,分别按根-左-右、左 阅读详情

二叉树开端

我们要理解二叉树我们可以先看看什么是树,如图

这个树虽然没有什么叶子,不是很好看,但是用在这里刚刚好,我们从局部来看它,随便挑一根树枝,

大概是这样,由一根粗的的主干和一些细的支干构成(枝干和主干在一定条件下面是可以转换的,说一个最通俗的例子就是,有一颗大树,它只有一个主干对吧,我爬上去把他上面的一个小枝干折下来,种在地上,而这个小枝干就变为了一课树,这个枝干也就变为了主干),而这些枝干拼接再主干上面,这样就可以算一颗树,也可以算一颗树上面的一个小枝干(我们把这个主干看为一支粗一点的枝干,就好了)

这个是真实的树,而我们抽象到计算机里面来看

就是和一个树状图很像,而二叉树就是一种特殊的树,就是一个主干,在这个主干上面有且只有两个枝干就叫二叉树

二叉树

完全二叉树与满二叉树

这个就是青天大老爷画的二叉树,我们不看叶子的话,就和我们的定义(我们后面聊)一模一样了,我们把它抽象到计算机里面就是

这个我们也叫满二叉树,而右边少了一点的话,我们就叫完全二叉树而且不能少太多(最后一行),但是右边少几个无所谓,但是左边的一定要完全健在(而这个左边右边的区分,是随便你的,假如你想左边只有一个也可以,你想右边只有一个都是可以的)

二叉树的概念

现在我们再聊一聊二叉树的概念结点的度(别背,后面我们讲怎么理解):

我们先说什么是度,就是一个主干上面有几个枝干,就有几个度,抽象一下就是有几条线连向节点,度就是几,而一棵树的度,就是在每个节点种找出度最大的节点,这个节点的度就是树的度。别的都很通俗易懂了,就不说了。

二叉树的性质

我们主要看3和5。这个3是怎么算的呢,我们首先要知道一个大前提,就是节点等于度加一,我们假设节点有n个,度为m,n = m+1,而因为是二叉树,使用我们节点的度的取值只有0,1,2。所以我们就可以计算一棵树全部的读,度*个数(我们设度为0有z,度为1有x,度为2有y),0*z+1*x+2*y = m,而z+x+y = n,所以z+x+y = 0*z+1*x+2*y+1,就可以得到z =y+1。

我们再看5,这个其实你自己画出来就可以看出来的,但是我要补充一点,如图

我假如我们是从1开始编号,这个二叉树的编号是不是就刚好等于节点的值(这个也是为了方便我们观察),我们可以很轻松的看出1的右节点是自己的2倍,左节点是自己的2倍+1。

接下来,我们来看看二叉树的结构

二叉树的结构

二叉树的结构有两种一种是顺序结构,还有一种是链式结构

顺序结构

顺序结构就是二叉树的数据,我们使用一个数组来存储,这里就有一道经典的面试题,就是106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode),而这个是从数组构建二叉树,而从二叉树变为数组就是二叉树的层序遍历(我们再代码实现里面写)(本章出现的算法题,我们再下一篇一起写一写)

链式结构

链式结构就容易很多了(后面我们用二叉树的实现各种操作的时候,也都是用链式结构来实现的)所以现在我就说一个大概就是我创建一个类型他包括一个值,还有两个引用,一个引用指向左节点,另一个指向右节点就没了,就这么简单。现在我们就写一下代码

二叉树的代码实现前中后层序遍历

二叉树的构建,上面我们说了就是一个值,两个引用

    public static class Node{        
        public int data;
        public Node Left;
        public  Node Right;

        Node(int value){
            this.data = value;
            this.Right = null;
            this.Left = null;
        }

 这个就是二叉树的构建

接下来我们,写前序遍历,但是在这之前我想要提一句,二叉树后面要用到递归,而我们为什么要使用递归,我认为递归是一个先进后出的思想,而我们还有别的办法可以实现先进后出那就是栈(Stack),所以我们二叉树的实现也可以使用栈来实现(在下一篇我会写一道使用栈来实现二叉树的遍历)

前序遍历其实,很简单就是我先把值取出来在递归左子树,最后是右子树

        public static void AheadOver(Node head){
            if(head == null)
            {
                return;
            }
            System.out.println(head.data);
            AheadOver(head.Left);
            AheadOver(head.Right);
        }

 而中序遍历就是先递归左子树,在遍历根节点,最后递归右子树,后序遍历就是先遍历左子树,再遍历右子树,最后遍历根节点,这个很简单就直接上代码了

       public static void BetweenOver(Node head){
            if(head == null){
                return;
            }
            BetweenOver(head.Left);
            BetweenOver(head.Right);
            System.out.println(head.data);
        }
        public static void Extremity(Node head){
            if(head == null){
                return;
            }
            Extremity(head.Left);
            System.out.println(head.data);
            Extremity(head.Right);
        }

 现在我们就来写一写层序遍历了,我们再按照上面的思路就不行了,因为链式一般情况下是一直向链表下游前进,在二叉树里面就是(从主干朝向叶子),因此我们实现层序遍历就很复杂,所以就想要一个操作可以把我们遍历的数据记录下来,但是不输出,在我想要他的时候,他再输出。而我们想要存储数据一般是两种操作,栈和队列,那我们要选择那种呢恶魔就要零思考一下,这两种操作的有什么不一样的地方,栈是先进后出,而队列是先进先出,如果说我们使用栈(先进后出,是不是就和我们递归操作差不多了,既然我们递归都不好实现了,所以说我们把栈排除了),所以我们的选择应该是队列,那要实现层序,我们可不可以出一行,进一行呢(好像可以,因为我们只需要对出的那一行的每个元素进行访问,再把他的左右子树添加到队尾是不是就可以了),

        public static void ToString(Node head){
            Queue<Node> q = new LinkedList<>();
            q.offer(head);
            while (q.peek() != null){
                Node node = q.poll();
                System.out.println(node.data);
                q.offer(node.Left);
                q.offer(node.Right);
            }
        }
        //这个是层序遍历

 这篇要写的就这么多,下一篇,我找一些二叉树的经典算法题,让我们来好好动动脑子。

【WRF-Urban】WUDAPT详解:An Urban Weather, Climate, and Environmental Modeling Infrastructure WUDAPT详解:An Urban Weather, Climate, and Environmental Modeling Infrastructure 阅读详情

相关推荐

10xGenomics官方可视化工具——Loupe Browser

Loupe Browser是⼀款10xGenomics开发的交互式桌⾯应⽤程序,⽤于探索10x单细胞数据,可以用来找出感兴趣的细胞、找出显著差异表达的基因、鉴定细胞类型、探索细胞亚类和数据共享。

weixin_47195452的博客 3357

二叉树的性质和C代码实现

一.二叉树的结构和性质 二叉树是由许多个节点组成的一种树状的存储数据的结构,每个节点包含了存储的数据和左右两个分支的指针以及一个记录访问该节点次数的计数器。 每个节点的左子节点的数据小于该节点,该节点小于右子节点。 根据以上二叉树的性质,我们在创建二叉树时可以有一下迭代关系式: 创建节点和添加数据: creatnode(value) addnode(struct node *proot,int value)= proot (proot->item = value) proot-

weixin_42224577的博客 242

飞塔防火墙和paloalto防火墙构建ipsec

一、配置fortigate防火墙1.防火墙配置上网功能1.1配置fortigate的wan1接口IP为100.100.100.2/24VLAN交换internal,IP地址为192.168.156.99/24。开启DHCP分配IP地址范围为192.168.156.110-192.168.156.2101.2配置访问互联网的缺省路由1.3配置访问互联网的安全策略2.配置与Paloalto防火墙的IPSECVPN。

weixin_44675999的博客 3738

【数据结构】二叉树的性质和代码实现(Java)

本文讲解二叉树的一些基本概念和性质,实现了二叉树的一些常用方法,包括:前序遍历、中序遍历、后序遍历、层序遍历、递归方法计算二叉树高度、迭代方法计算二叉树高度、运用层序遍历判断是否为完全二叉树等。

ZhangBaiWanA的博客 197

面试真题集(十六):TensorRT基础

TensorRT面试真题解析:从模型优化到推理部署 本文精选了14道TensorRT面试题,涵盖选择题、简答题和场景题,深度考察推理工程师对TensorRT核心技术的理解。内容聚焦三个关键维度: 基础概念 FP16推理中Softmax层为何需保持FP32(数值稳定性) INT8校准原理(EntropyCalibrator2的鲁棒性优势) Plugin V3接口的构建/运行分离设计 性能优化 Conv-BN-ReLU融合减少40-60%延迟的关键机制(访存优化) 动态Shape配置策略(min/opt/max

PeterPan的博客 70

C# & SQL Server 实时数据同步:7步轻松搞定,代码详解

实时数据同步是指在一个数据库中的数据发生变化时,能够立即或近乎立即地将这些变化同步到另一个数据库中。这种同步可以是单向的(从源数据库同步到目标数据库),也可以是双向的(两个数据库互相同步)。通过本文的详细讲解和代码示例,相信你已经学会了如何使用C#和SQL Server实现数据库的实时数据同步。实时数据同步不仅可以提升系统的响应速度,还能确保数据的一致性和准确性。希望这篇教程对你有所帮助,期待你在C#编程中取得更大的成就!🌟✨如果你有任何问题或建议,欢迎在评论区留言交流!

java专栏 514

详解二叉树_概念性质和功能实现(遍历/计算节点/判断二叉树)

二叉树的概念和计算节点层数等的性质;特殊的二叉树(完全二叉树和满二叉树);二叉树的功能实现(遍历计算等)

卜及中的博客 340

零基础学simulink仿真建模--基于Simulink进行近端策略优化(PPO)路径规划的仿真建模

特点高效性与稳定性:通过引入剪裁机制,在更新策略时限制步长,从而提高了训练过程的稳定性和效率。适用于多种动作空间:可以处理连续和离散的动作空间问题。无需模型:不需要预先知道环境的确切模型,适合复杂或未知环境。挑战收敛速度与稳定性:确保算法能够在合理的时间内找到近似最优解,并保持训练过程的稳定性。探索与利用平衡:在探索新路径和利用已知信息之间取得平衡。计算资源:对于大规模状态空间和动作空间,计算资源需求较高。首先明确要模拟的任务内容。目标(例如到达指定地点、避开障碍物等)。

amy_mhd的博客 249

二叉树的性质和遍历代码实现

二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个节点最多只能有两棵子树,且有左右之分。二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个节点。

caka07的博客 299

Coze智能体实战:接口需求分析和接口调试

AI智能体的需求:能根据接口文档提取接口信息以及设计接口测试点,并进行接口调试返回接口测试结果。

十二测试录 282

【Network Management】DCM模块唤醒网络是主动唤醒还是被动唤醒

DCM模块唤醒网络是主动唤醒还是被动唤醒

qq_36056498的博客 1539

树的介绍、树的定义和基本术语、二叉树的定义和性质、二叉树的顺序表示与实现和链式表示与实现以及树的遍历方法以及两种创建方式

​ 树是一种非线性的数据结构,是以分支关系定义的层次结构,比如人类社会中的族谱、及各种机制、组织的关系都可以用树形象的表示。重点学习二叉树的存储和相关操作,还要讨论树、森林、二叉树的转换关系。**树:**是n个结点的有限集,当0==n时称为空树,我们不讨论空树。**根结点:**树的最顶层的结点,一棵树有且仅有一个。**子树:**一棵树除根结点外,剩余的是若干个互不相交的有限集,每一个集合本身又是棵树,称称为根的子树。......

Hidin的博客 489

Monorepo与pnpm:前端项目管理的完美搭档

pnpm又称 performant npm,翻译过来就是高性能的npm。Monorepo是一种项目开发与管理的策略模式,它代表"单一代码仓库"(Monolithic Repository)。在Monorepo模式中,所有相关的项目和组件都被存储在一个统一的代码仓库中,而不是分散在多个独立的代码仓库中,这些项目之间还可能会有依赖关系。

m0_68271787的博客 2562

【数据结构初阶之二叉树】:二叉树相关的性质和经典的习题(用C语言实现,附图详解)

文章目录一、树的概念及结构1.树的概念2.树当中相关的概念3. 树的表示二、二叉树的概念及结构1.二叉树的概念2.特殊的二叉树3.二叉树的性质4.二叉树的存储结构三、二叉树链式结构的实现1.二叉树的创建2.二叉树的前序遍历3.二叉树的中序遍历4.二叉树的后序遍历 一、树的概念及结构 1.树的概念 在数据结构中什么是树呢?我们有如下定义和性质: 定义: 树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝.

平凡的指针的博客 1717

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

二叉树 二叉树的性质 存储结构 遍历二叉树 C实现二叉树的创建和遍历 线索二叉树

定义 二叉树(binary tree)是n(n>=0)个结点的有限集合,该集合为空集合称为空二>叉树,或者有一个根结点和两棵互不相交的,分别称为树根结点的左孩子树和右>孩子树组成. 二叉树的特点 每个结点最多有两棵子树,所以二叉树总没有度大于2的结点 左子树和右子树是有顺序的,次数不能任意颠倒 即使树中某结点只有一棵子树,也要区分是左子树还是右子树 特殊的二叉树1. 斜树 所有的结点都只有左

ftd 1291

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

二叉树基础全解析:从定义、性质到遍历和实现

二叉树是数据结构中连接线性结构与复杂树形结构的基石,其每个节点最多两个子节点的特性,让查找、插入、删除等操作在有序场景下获得对数级效率。理解深度、高度、满二叉树与完全二叉树等核心概念,是掌握后续平衡树、堆、Trie等高级结构的前提。遍历是二叉树最基础的操作,包括前序、中序、后序和层序,递归与迭代两种实现分别对应系统调用栈与显式栈的模拟,不仅在算法面试中高频出现,也是序列化、表达式解析等实际应用的关键。通过从零手写节点类、构建与反序列化,能避开空树、单节点、链表化等常见陷阱,从而真正建立递归思维,为进阶算法打

weixin_34199764的博客 190

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

二叉树的基本性质及使用实现

1、前言 在现实生活中,大部分事物之间的关系都是非常复杂的,单从事物联系的数量来说,有的是一对一的关系,有的是一对多的关系,有的是多对多的关系。这就诞生了除了线性结构以外,还包含了树结构和图结构。树结构通常来免回一对多的关系,图结构则总是用在多对多的关系。前者比如族谱,后者比如交通图。因此,对于它们的了解,可以加强我们对现实生活的事物之间的抽象理解,这样才可以开发处符合现

HyHarden的博客 3725

二叉树的概念、性质、创建 + Python实现

这篇博客介绍二叉树,包括二叉树的基本概念、二叉树的性质以及Python的实现。 我们先来看看什么是二叉树? 二叉树的基本概念 二叉树是每个节点最多有两个子树的结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree) 如图所示是一个二叉树。 二叉树的性质 性质1:在二叉树的第iii层上至多有2i−12^{i-1}2i−1个节点(i>0)(i>0)(i>0) 性质2:深度为kkk的二叉树至多有2k−12^k-12k−1个节点(k>0)(k&g

蕾欧娜与26的博客 319

二叉树的实现C++实现

树的基本性质 定义: 1.一棵树t是一个非空的有限元素的集合,其中一个元素为根(root),其余的元素(如果有的话)组成t的子树(subtree)。 2.一棵树的高度(height)或深度(depth)是树中级的个数。 3.一个元素的度(degree of an element)是指其孩子的个数,叶节点的度为0。一棵树的度(degree of a tree)是指其元素的度的最大值。 二叉树 定义...

sinat_40408114的博客 862

二叉树的性质和常用操作代码集合

二叉树的性质和常用操作代码集合性质: 二叉树的性质和常用代码操作集合 性质1:在二叉树的第i层上至多有2^i-1个结点 性质2:深度为k的二叉树至多有2^k - 1个结点 性质3:对任意一棵二叉树T,若终端结点数为n0,而其度数为2的结点数为n2,则n0 = n2 + 1 满二叉树:深度为k且有2^-1个结点的树 完全二叉树:深度为k,结点数为n的二叉树,如果其结点1

Steve Wang's blog 2433

第五章 树和二叉树(上)【基本概念性质和二叉树遍历】

二叉树是n (n>=0)个结点的有限集合或者为空二叉树,即n =0。或者由一个根结点和两个互不相交的被称为根的左子树和右子树组成。左子树和右子树又分别是一棵二叉树。每个结点至多只有两棵子树左右子树不能颠倒 (二叉树是有序树)二叉树可以是空集合,根可以有空的左子树和空的右子树注意区别:度 为2的有序树(至少有一个结点度为2)二叉树的五种状态。

zdlzf的博客 443

二叉树以及堆的实现

树是⼀种非线性的数据结构,它是由n(n>=0)个有限结点组成⼀个具有层次关系的集合。把它叫做树是因为它看起来像⼀棵倒挂的树,也就是说它是根朝上,而叶朝下的。有⼀个特殊的结点,称为根结点,根结点没有前驱结点。除根结点外,其余结点被分成M(M>0)个互不相交的集合,其中每⼀个集合又是⼀棵结构与树类似的⼦树。每棵子树的根结有且只有⼀个前驱,可以有0个或多个后继。因此,树是递归定义的。子树不相交除了根结点外,每个结点有且仅有一个父结点一棵N个结点的树有N-1条边。

2302_79180171的博客 1100

二叉树的建立和遍历C&python实现

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 二叉树的建立和遍历C&python实现前言一、树二、二叉树三、二叉树的C实现运行结果三、二叉树的python实现运行结构总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、树 线性表、栈、队列都是一对一的线性结构,除了第一个和最后一个元素外,其他的都有唯一

weixin_41986750的博客 4324

Python树与树算法、二叉树的实现

一、树与树算法 1、树的概念和特点 树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: 每个节点有零个或多个子节点; 没有父节点的节点称为根节点; 每一个非根节点...

weixin_46309026的博客 380

【数据结构笔记09】二叉树的定义、性质、实现

二叉树的定义、性质、完全二叉树的数组实现,一般二叉树的链表实现。

记录学习痕迹的公众号:Piper蛋窝 581

【数据结构】基于比较的排序算法 - 交换排序

本文介绍交换排序中的冒泡排序与快速排序。冒泡排序通过相邻元素比较交换,实现升序,时间复杂度最坏为O(N²),空间复杂度O(1),稳定且适合小规模有序数据。快速排序采用分治思想,以基准值划分区间,平均时间复杂度O(N log N),空间复杂度O(log N),但不稳定,实际应用中性能优异,可通过随机基准、小区间优化等提升效率。

careathers的博客 335
上一篇: 图书管理系统(Java)
下一篇: 二叉树的面试题
star050913
博客等级 码龄3年 277粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值