Java二叉树(1)

🐵本篇文章将对二叉树的相关概念、性质和遍历等知识进行讲解


  一、什么是树

在讲二叉树之前,先了解一下什么是树:树是一种非线性结构,其由许多节点和子节点组成,整体形状如一颗倒挂的树,比如下图:

A就是这棵树的根,BDEF、D、CG、G等都可以看作这颗树的一颗子树,在树形结构中子树之间不能由交集,否则不能称为树,如下图就不是树:

二、树的相关概念

1. 结点的度:一个结点含有子结点的个数称为该结点的度,如A的度为2,B的度3,D的度为0

2. 树的度:所有结点度的最大值称为树的度,比如上树中B的度最大,则该树的度为3

3. 叶子结点/终端结点:度为0的结点称为叶子结点,如上树中的D E F G

4. 双亲结点/父结点:一个结点的前驱结点称为该结点的父结点,如B的父结点为A

5. 孩子结点/子结点:一个结点的后继结点称为该结点的子结点,如B的子结点有D E F

6. 根结点:没有双亲结点的结点称为根结点,上树的根结点为A

7. 结点的层次:从根结点那一层开始定义,A为第一层(有时是从0开始),B C所处第二层,依此类推

8. 树的高度:树中结点的最大层次为称为该树的高度,上树的高度为3

三、二叉树

二叉树是一种特殊的树,一棵所有结点的度都小于等于2的树称为二叉树

二叉树特别讲究顺序,如上图中如果G为C的左孩子,则又是一颗完全不同的二叉树

3.1 满二叉树

从根结点开始,从上到下从左到右每一层都放满了结点的树称为满二叉树,如下图:

若一个满二叉树有k层,则其每一层有2^(k - 1)个结点,整个树共有(2^k) - 1个结点

3.2 完全二叉树

从根结点开始,从上到下从左到右依次存放结点,最后一层可以不满,这样的二叉树称为完全二叉树,如下图:

下图不是完全二叉树:

3.3 二叉树的性质

1. 若规定根结点的层数为1,则一棵非空二叉树的第i层上最多有2^(i - 1)个结点

2. 若规定根结点的层数为1,则一棵非空二叉树的最大结点数是(2^i) - 1

3. 对任何一棵二叉树,如果其叶结点个数为n0,度为2的结点个数为n2,则有n0=n2+1

4. 具有n个结点的完全二叉树高度为:log₂(n + 1)向上取整,如:3.x为4;或者log₂(n) + 1向下取整,如3.x为3

5. 具有n个结点的完全二叉树,从上到下从左到右依次编号,规定根结点的编号为0,则编号为i的结点:双亲编号:(i - 1) / 2;左孩子编号:2i + 1,若2i + 1 > n则无左孩子;右孩子编号:2i + 2,若2i + 2 > n则无右孩子

下面讲一道例题:

一个具有767个节点的完全二叉树,其叶子节点个数为()
A 383
B 384
C 385
D 386

【解析】由于二叉树中的结点的度都不大于2,所以设度为0,1,2的结点的个数分别为n0,n1,n2,则n0 + n1 + n2 = 767,由性质3:n0 = n2 + 1得2*n0 + n1 = 768,在完全二叉树中,度为1的结点只可能有1个或0个,如果n1 = 1,则n0不是一个整数,所以n1只可能为0,经计算n0 = 384

3.4 二叉树的存储

二叉树有两种存储方式,分别为链式存储和顺序存储,这里主要讲解链式存储,接下来用代码以穷举的方式先构造下面这个二叉树

public class BinaryTree {static class TreeNode{public char val; public TreeNode left; //指向该结点的左孩子public TreeNode right; //指向该结点的右孩子public TreeNode(char val) {this.val = val;}}
}

接下来以穷举的方式构造二叉树

    public TreeNode creatTree() {TreeNode A = new TreeNode('A');TreeNode B = new TreeNode('B');TreeNode C = new TreeNode('C');TreeNode D = new TreeNode('D');TreeNode E = new TreeNode('E');TreeNode F = new TreeNode('F');TreeNode G = new TreeNode('G');TreeNode H = new TreeNode('H');A.left = B;A.right = C;B.left = D;B.right = E;E.right = H;C.left = F;C.right = G;return A; //返回这个树的根结点}

3.5 二叉树的遍历

二叉树共有3种遍历方式,分别为:先序遍历、中序遍历、后序遍历,接下来会逐个讲解 

3.5.1 先序遍历

先序遍历一个树,按照根、左子树、右子树的顺序遍历这个树,直接看例子:

先遍历这个树的根A,之后遍历A的左B,由于B又是一个子树的根,所以要继续遍历B的左,B的左为空,那就遍历B的右:F,F是一个子树的根,所以要继续遍历F的左:D,D的左右都为空,那么F的左子树全部遍历完毕,接着遍历F的右,F的右为空,那么B的右全部遍历完毕,那接着就是A的左全部遍历完毕,之后遍历A的右:C,C又是一个子树的根,所以要继续遍历C的左,C的左为空,那就遍历C的右:G,G的左右都为空,至此A的右也全部遍历完毕,那么整个二叉树遍历完毕整个遍历的序列为:A B F D C G

3.5.2 中序遍历

先序遍历一个树,按照左子树、根、右子树的顺序遍历这个树,直接看例子:

先遍历A的左,由于A的左也是一个子树,所以要遍历这个子树的左:空,这个子树的左遍历完就要遍历这个树的根:B,之后遍历这个子树的右:F D,这也是一个子树,所以要先遍历这个子树左:D,然后遍历根:F,最后是右,右为空,那么整个二叉树的左遍历完毕,接着遍历根:A,然后遍历右子树:C G,先遍历这个树的左,左为空,然后遍历根:C,最后是右:G,至此整个二叉树遍历完毕,整个遍历的序列为:B D F A C G

3.5.3 后序遍历

先序遍历一个树,按照左子树、右子树、根的顺序遍历这个树,直接看例子:

先遍历这个二叉树的左子树:B F D,这也是一个树,所以先遍历这个树的左,左为空,然后遍历这个树的右子树:F D,这也是一个树,所以要先遍历这个树的左:D,然后遍历这个树的右,右为空,最后是根:F,那么B F D这个子树的右遍历完毕,然后遍历B F D这个树的根:B,至此整个树的左子树遍历完毕,然后遍历这个树的右子树:C G,先遍历这个树的左,左为空,然后遍历右:G,再遍历根C,最后遍历整个树的根:A,整个树遍历完毕,整个遍历的序列为:D F B G C A

3.6 代码实现二叉树的遍历

二叉树的三种遍历需要用递归的思想实现

先序遍历:

    public void preOrder(TreeNode root) {if (root == null) { //如果根为空则直接返回return;}System.out.print(root.val +" ");preOrder(root.left); //以根的左孩子为新的根继续遍历preOrder(root.right); //以根的右孩子为新的根继续遍历}

root为null后返回至上一个方法,遍历D的右孩子,右孩子也为空,则以D为根的方法结束返回至上一个方法,遍历B的右孩子

右子树也是同样的道理

中序遍历:

    public void inOrder(TreeNode root) {if (root == null) {return;}preOrder(root.left);System.out.print(root.val +" ");preOrder(root.right);}

后序遍历:

    public void postOrder(TreeNode root) {if (root == null) {return;}preOrder(root.left);preOrder(root.right);System.out.print(root.val +" ");}

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

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

相关文章

1. vue3-环境准备

1、安装node.js 如果开发环境上面没有安装node.js,需要到node.js官方网站下载node.js。下载安装后,可以通过npm --version查看nodejs版本 2. 开发工具 开发工具建议使用vscode

C#,数值计算,求解微分方程的吉尔(Gear)四阶方法与源代码

1 微分方程 微分方程,是指含有未知函数及其导数的关系式。解微分方程就是找出未知函数。 微分方程是伴随着微积分学一起发展起来的。微积分学的奠基人Newton和Leibniz的著作中都处理过与微分方程有关的问题。微分方程的应用十分广泛,可以解决许多与导数…

Linux 学习笔记(8)

八、 启动引导 1 、 Linux 的启动流程 1) BIOS 自检 2) 启动 GRUB/LILO 3) 运行 Linux kernel 并检测硬件 4) 挂载根文件系统 5) 运行 Linux 系统的第一个进程 init( 其 PID 永远为 1 ,是所有其它进程的父进程 ) 6) init 读取系统引导配置文件…

分布式基础 --- Leader election

分布式基础 --- Leader election 为什么需要leader electionRing electionBully Algorithm 为什么需要leader election 在一组集群中, 需要选出一个leader来承担一些特别的任务, 比如 协调和控制系统操作:领导者负责协调和控制整个分布式系统的操作。它可以接收和处…

46、WEB攻防——通用漏洞PHP反序列化原生类漏洞绕过公私有属性

文章目录 几种常用的魔术方法1、__destruct()2、__tostring()3、__call()4、__get()5、__set()6、__sleep()7、__wakeup()8、__isset()9、__unset()9、__invoke() 三种变量属性极客2019 PHPphp原生类 几种常用的魔术方法 1、__destruct() 当删除一个对象或对象操作终止时被调…

数据中心GPU集群高性能组网技术分析

数据中心GPU集群组网技术是指将多个GPU设备连接在一起,形成一个高性能计算的集群系统。通过集群组网技术,可以实现多个GPU设备之间的协同计算,提供更大规模的计算能力,适用于需要大规模并行计算的应用场景。 常用的组网技术&…

码垛工作站:食品生产企业的转型助推器

在当今高度自动化的工业生产中,码垛工作站的应用正逐渐成为一种趋势。某食品生产企业在面临市场竞争加剧、人工成本上升等多重压力下,决定引入码垛工作站,以期实现生产流程的升级与变革。 一、码垛工作站引入背景 该企业主要从事休闲食品的…

iMazing3安全吗?好不好用?值不值得下载

一、安全性 iMazing在设计和开发过程中,始终把用户数据的安全性放在首位。它采用了多种先进的安全技术来确保用户数据在传输、备份和存储过程中的安全。 iMazing3Mac-最新绿色安装包下载如下: https://wm.makeding.com/iclk/?zoneid49816 iMazing3Wi…

mysql 常用命令练习

管理表格从表中查询数据从多个表查询修改数据sql变量类型 管理表格 创建一个包含三列的新表 CREATE TABLE products (id INT,name VARCHAR(255) NOT NULL,price INT DEFAULT 0,PRIMARY KEY(id) // 自增 ); 从数据库中删除表 DROP TABLE product; 向表中添加新列 ALTER TAB…

【Python】成功解决TypeError: list indices must be integers or slices, not float

【Python】成功解决TypeError: list indices must be integers or slices, not float 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&…

计算机二级Python刷题笔记------基本操作题11、14、17、21、30(考察列表)

文章目录 第十一题(列表遍历)第十四题(len)第十七题(len、insert)第二十一题(append)第三十题(二维列表) 第十一题(列表遍历) 题目&a…

c++之旅——第三弹

大家好啊,这里是c之旅第三弹,跟随我的步伐来开始这一篇的学习吧! 如果有知识性错误,欢迎各位指正!!一起加油!! 创作不易,希望大家多多支持哦! 一.命名空间;…

React-router的创建和第一个组件

需要先学react框架 首先:找到一个文件夹,在文件夹出打开cmd窗口,输入如下图的口令 npx create-react-app demo 然后等待安装 安装完成 接下来进入创建的demo实例 cd demo 然后可以用如下方式打开vscode code . 注意:不要忽略点号与…

vue2+elementui上传照片(el-upload 超简单)

文章目录 element上传附件(el-upload 超详细)代码展示html代码data中methods中接口写法 总结 element上传附件(el-upload 超详细) 这个功能其实比较常见的功能,后台管理系统基本上都有,这就离不开element的…

多层感知机 + 代码实现 - 动手学深度学习v2 | 李沐动手学深度学习课程笔记

感知机 感知机≈二分类问题 感知机和其他问题的对比 训练感知机 如果小于等于零,说明预测错啦 ,其实就是同号为正,异号为负 举个分类的例子 增加样本,改变分类线 继续分类 感知机的收敛定理 XOR问题 XOR问题其实就是第1、3象限数…

Java 语法糖,提高代码效率神器!

引言:语法糖经常是大厂面试官常问的一个知识点,关于 Java 的语法糖很多人可能只是知道其中的某几个,但却对整体的结构不了解,本文将详细介绍 Java 语法糖的知识。 题目 什么是 Java 语法糖? 推荐解析 什么是语法糖…

数据结构与算法学习【算法思想之二分法基础】

文章目录 数据结构与算法学习【算法思想之二分查找基础】本文学习目标或巩固的知识点 最基础的二分查找🟢通过题目可知题解结果验证 数据结构与算法学习【算法思想之二分查找基础】 本文学习目标或巩固的知识点 学习二分法类题目 巩固基础的二分法 提前说明&#…

机器人持续学习基准LIBERO系列10——文件结构

0.前置 机器人持续学习基准LIBERO系列1——基本介绍与安装测试机器人持续学习基准LIBERO系列2——路径与基准基本信息机器人持续学习基准LIBERO系列3——相机画面可视化及单步移动更新机器人持续学习基准LIBERO系列4——robosuite最基本demo机器人持续学习基准LIBERO系列5——…

(二)逻辑回归与交叉熵--九五小庞

什么是逻辑回归 线性回归预测的是一个连续值,逻辑回归给出的“是”和“否”的回答 Singmoid sigmoid函数是一个概率分布函数,给定某个输入,它将输出为一个概率值 逻辑回归损失函数 平方差所惩罚的是与损失为同一数量级的情形&#xff0…

Unity铰链四杆机构设计和运动仿真

一、效果图 设定好各边长度和转速后,点击【设置并启动】,自动生成一个机构模型,并按照原理进行运转 二、铰链四杆机构介绍 机架:A和D是固定位置,叫做机架。 曲柄:B点绕A点旋转,构成曲柄。 连…