数据结构之初始二叉树(2)
找往期文章包括但不限于本期文章中不懂的知识点:
个人主页:我要学编程(ಥ_ಥ)-CSDN博客
所属专栏:数据结构(Java版)
二叉树的前置知识(概念、性质、、遍历)
通过上篇文章的学习,我们已经知道什么是二叉树,以及其性质和遍历的方式了。接下来主要是实现代码。
目录
伪创建二叉树
遍历二叉树
获取二叉树中节点的个数
获取二叉树中叶子节点的个数
获取二叉树中第K层节点的个数
获取二叉树的高度
在二叉树中找寻元素
伪创建二叉树
为啥叫伪创建二叉树呢?因为我们现在才刚开始学习二叉树,而创建二叉树是一个非常复杂的过程(树的递归定义的)。因此我们就先手动的来创建二叉树。树是有一个一个的结点组成,因此得先把结点创建出来。树的结点我们采用的是简单的孩子表示法:
// 树的结点static class TreeNode {public char val; // 数据域public TreeNode left; // 左子树public TreeNode right; // 右子树public TreeNode(char val) {this.val = val;}}
创建的二叉树图形如下:
public TreeNode createBinaryTree() {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');// 根据图形关系把结点之间相连A.left = B;A.right = C;B.left = D;B.right = E;C.left = F;C.right = G;// 返回根结点return A;}
遍历二叉树
二叉树创建完成后,我们就可以遍历打印二叉树,看看是否符合我们的预期结果。遍历的四种方式,我们前面也学习了。
前序遍历:
// 前序遍历public void preOrder(TreeNode root) {if (root == null) {return;}// 打印根结点的值System.out.print(root.val+" ");// 递归遍历根的左子树preOrder(root.left);// 递归遍历根的右子树preOrder(root.right);}
递归的限制条件:当递归到 root 为 null 时,就开始回退。随着递归的深入,root 不断的接近 null。
中序遍历:
// 中序遍历public void inOrder(TreeNode root) {// 中序遍历:左子树->根->右子树if (root == null) {return;}// 递归遍历根的左子树inOrder(root.left);// 打印根结点的值System.out.print(root.val+" ");// 递归遍历根的右子树inOrder(root.right);}
后序遍历:
// 后序遍历public void postOrder(TreeNode root) {// 后序遍历:左子树->右子树->根if (root == null) {return;}// 递归遍历根的左子树postOrder(root.left);// 递归遍历根的右子树postOrder(root.right);// 打印根结点的值System.out.print(root.val+" ");}
由于层序遍历还是比较复杂,因此我们后面再学习。
获取二叉树中节点的个数
思路一:这个同样是遍历二叉树,遇到不为空的结点就++,最后统计的就是树的节点个数。
// 记录节点个数public int treeNodeSize; public void size(TreeNode root) {if (root == null) {return;}// 根结点treeNodeSize++;// 左子树size2(root.left);// 右子树size2(root.right);}
思路二:整棵树的节点个数等于 根结点+左子树的节点个数+右子树的节点个数
// 获取树中节点的个数public int size(TreeNode root) {if (root == null) {return 0;}// 左子树的节点个数+右子树的节点个数+根结点return size(root.left)+size(root.right)+1;}
思路一采用的是遍历的方式,思路二采用的是化为子问题的方式。思路二也是更加接近递归的方式。
获取二叉树中叶子节点的个数
思路:首先,我们得知道什么是叶子节点。叶子结点的特点是其左孩子和右孩子都是null。同样这也是采用遍历的方式。
法一:采用子问题思路
// 获取叶子节点的个数public int getLeafNodeCount(TreeNode root) {if (root == null) {return 0;}// 遇到叶子结点就返回1if (root.left == null && root.right == null) {return 1;}// 返回左子树的叶子节点个数+右子树的叶子节点个数return getLeafNodeCount(root.left) + getLeafNodeCount(root.right);}
法二:采用遍历思路
public int leafSize;public void getLeafNodeCount(TreeNode root) {if (root == null) {return;}if (root.left == null && root.right == null) {leafSize++;}// 遍历左子谁getLeafNodeCount2(root.left);// 遍历右子树getLeafNodeCount2(root.right);}
获取二叉树中第K层节点的个数
上面是对于第K层的介绍,根结点是作为第一层。
思路:当K为1时,就可以直接返回这一层的节点个数即可。因此我们就是要递归到K不断的接近1.
法一: 采用子问题思路
// 获取第K层节点的个数public int getKLevelNodeCount(TreeNode root, int k) {// 假定不存在K无效的情况if (root == null) {return 0;}if (k == 1) {return 1;}// 左子树的第k-1层的节点个数+右子树的第k-1层的节点个数return getKLevelNodeCount(root.left, k-1) +getKLevelNodeCount(root.right, k-1);}
法二: 采用遍历思路
public int getLevelNodeSize;public void getKLevelNodeCount(TreeNode root, int k) {// 假定不存在K无效的情况if (root == null) {return;}if (k == 1) {getLevelNodeSize++;}// 遍历左子树的第k-1层getKLevelNodeCount2(root.left, k-1);// 遍历右子树的第k-1层getKLevelNodeCount2(root.right, k-1);}
获取二叉树的高度
思路:获取二叉树的高度和求第K层节点的个数类似。同样根结点算高度为1。接着就是分别递归计算左子树和右子树的高度的最大值。
采用子问题思路
// 获取二叉树的高度public int getHeight(TreeNode root) {if (root == null) {return 0;}// 左子树与右子树的最大高度+根结点return Math.max(getHeight(root.left), getHeight(root.right)) + 1;}
这个如果不采用子问题思路,而是用遍历思路的话,只能用层序遍历来写,又因为层序遍历过于复杂,因此我们暂时先不写这个代码。
在二叉树中找寻元素
思路:这个比较简单,就是遍历去比较即可。
// 检测值为value的元素是否存在public TreeNode find(TreeNode root, int val) {if (root == null) {return null;}// 采用前序遍历的方式:根->左子树->右子树// 根if (root.val == val) {return root;}// 在左子树中寻找,肯定有一个结果TreeNode findLeft = find(root.left, val);// 如果不为null,则说明找到了if (findLeft != null) {return findLeft;}// 在右子树中寻找,肯定有一个结果,不管结果如何直接返回即可return find(root.right, val);}
注意:这里在寻找二叉树中的节点时,采用前序遍历的方式是最有效率的。因为前序遍历是首先比较根结点,而我们就是需要比较根结点。
对于二叉树的基本操作我们就已经学习完了。基于上述基本操作就可以进行一些简单的刷题了,后续也会在刷题中继续完善二叉树的相关操作。
好啦!本期 数据结构之初始二叉树(2)的学习之旅就到此结束啦!我们下一期再一起学习吧!
相关文章:

数据结构之初始二叉树(2)
找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏:数据结构(Java版) 二叉树的前置知识(概念、性质、、遍历) 通过上篇文章的学习,我们…...

如何预防最新的baxia变种勒索病毒感染您的计算机?
引言 在当今数字化时代,网络安全威胁层出不穷,其中勒索病毒已成为企业和个人面临的重大挑战之一。近期,.baxia勒索病毒以其高隐蔽性和破坏性引起了广泛关注。本文将详细介绍.baxia勒索病毒的特点、传播方式,并给出相应的应对策略…...
git列出提交记录的文件路径
一、如何列出某次提交记录中修改过/新增的文件? 方法1:使用 git diff-tree 命令来查看某个提交记录中修改过/新增的文件。具体来说,你可以使用以下命令: git diff-tree --no-commit-id --name-only -r <commit-hash>命令解…...

微信小程序密码 显示隐藏 真机兼容问题
之前使用type来控制,发现不行,修改为password属性即可 <van-fieldright-icon"{{passwordType password? closed-eye:eye-o}}"model:value"{{ password }}"password"{{passwordType password ? true: false}}"borde…...
C# 中,使用 LINQ 示例 备忘
语言集成查询 (LINQ) 是一系列直接将查询功能集成到 C# 语言的技术统称。 数据查询历来都表示为简单的字符串,没有编译时类型检查或 IntelliSense 支持。 此外, … 对于编写查询的开发者来说,LINQ 最明显的“语言集成”部分就是查询表达式。 …...

GaussDB DWS 详解
文章目录 GaussDB DWS 详解一、简介二、DWS的分布式架构架构概述关键组件 三、分布式查询数据查询流程SQL执行的示例 批注:本文引鉴了Forlogen博主的一些内容,并加以补充,以供学习了解。 GaussDB DWS 详解 一、简介 DWS(Data Warehouse Ser…...

【256 Days】我的创作纪念日
目录 🌼01 机缘 🌼02 收获 🌼03 日常 🌼04 成就 🌼05 憧憬 最近收到官方来信, 突然发现,不知不觉间,距离发布的第一篇博客已过256天,这期间我经历了春秋招、毕业答辩…...

3D云渲染工具对决:Maya与Blender的性能和功能深度比较
3D建模和动画制作已成为数字领域不可或缺的一环,无论是在影视特效的震撼场面,还是在游戏角色的生动表现,3D技术都扮演着至关重要的角色。而在这一领域,Maya和Blender这两款软件,以其强大的功能和广泛的应用,…...
spring.factories详解
spring.factories 是 Spring Boot 中一个重要的配置文件,它用于实现自动配置类和框架的扩展机制。这个文件通常位于项目的 resources/META-INF 目录下,并且遵循 Java 的 .properties 文件格式。以下是对 spring.factories 的详细解释: 自动配…...
从Docker Hub 拉取镜像一直失败超时?这些解决方案帮你解决烦恼
设置国内源: 提示:常规方案(作用不大) 阿里云提供了镜像源:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 登录后你会获得一个专属的地址 使用命令设置国内镜像源:通过vim /etc/docker/d…...

【pbootcms】新环境搭建环境安装时发生错误
【pbootcms】新环境搭建环境安装时发生错误 提示一下内容: 登录请求发生错误,您可按照如下方式排查: 1、试着删除根目录下runtime目录,刷新页面重试 2、检查系统会话文件存储目录是否具有写入权限; 3、检查服务器环境pathinfo及伪静态规则配置; 先按照…...

C语言之qsort函数
一、qsort 1.库函数qsort qsort是库函数,直接可以用来排序数据,底层使用的是快速排序。 qsort函数可以排序任意类型的数据。 2.头文件 #include<stdlib.h> 3.参数讲解 void*类型的指针是无具体类型的指针,这种类型的指针的不能直接解…...
R 数据重塑
R 数据重塑 在数据分析领域,R 语言以其强大的数据处理和可视化能力而著称。数据重塑是数据分析过程中的一个重要步骤,它涉及将数据从一种形式转换为另一种更适宜进行分析的形式。R 语言提供了多种工具和包来简化这一过程,如 dplyr、tidyr 和…...

opencascade AIS_InteractiveContext源码学习8 trihedron display attributes
AIS_InteractiveContext 前言 交互上下文(Interactive Context)允许您在一个或多个视图器中管理交互对象的图形行为和选择。类方法使这一操作非常透明。需要记住的是,对于已经被交互上下文识别的交互对象,必须使用上下文方法进行…...

【云岚到家】-day05-6-项目迁移-门户-CMS
【云岚到家】-day05-6-项目迁移-门户-CMS 4 项目迁移-门户4.1 迁移目标4.2 能力基础4.2.1 缓存方案设计与应用能力4.2.2 静态化技术应用能力 4.3 需求分析4.3.1 界面原型 4.4 系统设计4.4.1 表设计4.4.2 接口与方案4.4.2.1 首页信息查询接口4.4.3.1 数据缓存方案4.4.3.2 页面静…...
linux彻底卸载docker
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done 要彻底卸载 Docker 及其相关组件,可以按照以下步骤进行操作。请注意,这些步骤会删除 Docker 安装的所有容器、镜…...

linux高级编程(网络)(www,http,URL)
数据的封包和拆包 封包: 应用层数据(例如HTTP请求)被传递给传输层。传输层(TCP)在数据前添加TCP头部(包含端口号、序列号等)。网络层(IP)在TCP段前添加IP头部ÿ…...
Perl 语言开发(十三):网络编程
目录 1. 概述 2. 网络编程基础 2.1 网络协议概述 2.2 Perl 网络编程基础模块 3. TCP 网络编程 3.1 创建 TCP 服务器 3.2 创建 TCP 客户端 4. UDP 网络编程 4.1 创建 UDP 服务器 4.2 创建 UDP 客户端 5. 高级网络编程 5.1 非阻塞 I/O 5.2 多线程网络编程 6. 简单的…...

Leetcode算法题(移除链表中的元素)
题目如下: 思路1:创建一个新的带头链表 (newhead),遍历头结点对应的值分别于x进行比较,将不等于x的节点尾插到新的带头链表中,返回新的带头链表的下一个节点。 代码如下: typedef …...
浅谈网络安全防守:从被动应对到主动管理的转变
浅谈网络安全防守:从被动应对到主动管理的转变 背景: 在当今的数字时代,网络安全已成为企业生存和发展的重要基石。然而,当企业的网络安全体系面临着诸如资产不清、互联网应用管理混乱、边界防火墙策略失效、长期未修复的漏洞、…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...

USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...