二叉树--算法题总结
1、利用层序遍历的产生的字符串来创建二叉树
/*** 使用层序遍历的字符串创建二叉树* @param treeInfo* @return*/public static TreeNode generateTreeNodeSecond(String treeInfo) {LinkedList<TreeNode> treeNodeLinkedList = new LinkedList<>();if(StringUtils.isEmpty(treeInfo)) {return null;}String[] stringList = treeInfo.split(",");int i =0;TreeNode root = new TreeNode(Integer.valueOf(stringList[i]));treeNodeLinkedList.offer(root);i++;while(!treeNodeLinkedList.isEmpty()) {TreeNode currentNode = treeNodeLinkedList.poll();String temp = stringList[i];if(temp.compareTo("null")!=0) {currentNode.left = new TreeNode(Integer.valueOf(temp));treeNodeLinkedList.offer(currentNode.left);}i++;temp = stringList[i];if(temp.compareTo("null")!=0) {currentNode.right = new TreeNode(Integer.valueOf(temp));treeNodeLinkedList.offer(currentNode.right);}i++;if(i>= stringList.length) {break;}}return root;}
2、层序遍历二叉树
public static List<List<Integer>> levelShow(TreeNode root) {List<List<Integer>> listList = new ArrayList<>();LinkedList<TreeNode> treeNodeLinkedList = new LinkedList<>();treeNodeLinkedList.offer(root);while(!treeNodeLinkedList.isEmpty()) {int size = treeNodeLinkedList.size();List<Integer> rowInfo = new ArrayList<>();for(int i =0;i< size;i++) {TreeNode treeNode = treeNodeLinkedList.poll();// 读取数据rowInfo.add(treeNode.value);if(treeNode.left !=null) {treeNodeLinkedList.offer(treeNode.left);}if(treeNode.right !=null) {treeNodeLinkedList.offer(treeNode.right);}}listList.add(rowInfo);}return listList;}
3、获取树中节点的个数
/*** 获取树中节点的个数* @param root* @return*/public int size(TreeNode root) {if(root == null) {return 0;}//递归遍历左子树int a = size(root.left);int b= size(root.right);return a + b+ 1;}
4、获取叶子节点的个数
/*** 获取叶子节点的个数* @param root* @return*/public int getLeaf(TreeNode root) {if(root == null) {return 0;}if(root.left == null &&root.right == null) {// 判断叶子左右节点是否为空,若为空则为叶子节点return 1;}int getLeafLeft = getLeaf(root.left);int getLeafRight = getLeaf(root.right);return getLeafLeft + getLeafRight;}
5、获取第k层的节点个数
/*** 获取第k层的节点个数* @param root* @param k* @return*/public static int getKLevelNode(TreeNode root,int k) {if(root == null) {return 0;}if(k == 1) {return 1;}int getKLevelNodeLeft = getKLevelNode(root.left , k-1);int getKLevelNodeRight = getKLevelNode(root.right , k -1);return getKLevelNodeLeft +getKLevelNodeRight;}
6、查询对应值的节点
public static TreeNode find(TreeNode root, int val) {if(root == null) {return null;}if(root.value == val) {return root;}// 左子树查找val 使用对应的值TreeNode leftTree = find(root.left, val);// 接收值不为 null ,说明左子树已经查找到valif(leftTree != null) {return leftTree;}// 右子树查找val, 使用 rightTree 来接收TreeNode rightTree = find(root.right ,val);if(rightTree !=null) {return rightTree;}// 走到这一步说明左右子树都没有找到val,直接返回nullreturn null;}
7、是否是完全二叉树
public static boolean isCompleteTree(TreeNode root) {LinkedList<TreeNode> queue = new LinkedList<>();queue.offer(root);boolean isStep1 = true;while(!queue.isEmpty()) {TreeNode node = queue.poll();if(isStep1) {if(node.left !=null && node.right != null) {queue.offer(node.left);queue.offer(node.right);} else if(node.left !=null){queue.offer(node.left);isStep1 = false;} else if(node.right !=null) {return false;} else {isStep1 = false;}} else {// 到达第二轮的时候,如果两者存在一个为空的就说明不是完全二叉树if(node.left!=null || node.right !=null) {return false;}}}return true;}
8、两棵树是否完全相同
/*** 检查两颗树是否相同* @param p* @param q* @return*/public static boolean isSameTree(TreeNode p, TreeNode q) {if( p== null&& q== null) {return true;}if ( p == null || q == null) {return false;}if(p.value == q.value) {return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);}return false;}
9、一颗树是否是另一个树的子树
/*** 判断是否是子树* @param root* @param subRoot* @return*/public static boolean isSubTree(TreeNode root ,TreeNode subRoot) {if(subRoot == null) {return true;}if(root == null) {return false;}// 递归判断return isSameTree(root,subRoot) || isSubTree(root.left,subRoot) ||isSubTree(root.right,subRoot);}
10、打印从根节点到子节点的路径
/*** 打印对应根节点到子节点的路径* @param root*/public static void showTrace(TreeNode root) {List<String> result = new ArrayList<>();// 声明一个队列LinkedList<TreeNode> queue = new LinkedList<>();// 记录路径信息LinkedList<String> stringLinkedList = new LinkedList<>();queue.offer(root);stringLinkedList.offer(root.value + "");while(queue !=null) {TreeNode tempNode =queue.poll();String currentPath = stringLinkedList.poll();// 说明不是子节点if(tempNode.left == null && tempNode.right == null) {result.add(currentPath);}if(tempNode.left != null) {queue.offer(tempNode.left);stringLinkedList.offer(currentPath + "->" + tempNode.left.value);}if(tempNode.right !=null) {queue.offer(tempNode.right);stringLinkedList.offer(currentPath + "->" + tempNode.right.value);}}for(String item: result) {System.out.println(item);}}
相关文章:
二叉树--算法题总结
1、利用层序遍历的产生的字符串来创建二叉树 /*** 使用层序遍历的字符串创建二叉树* param treeInfo* return*/public static TreeNode generateTreeNodeSecond(String treeInfo) {LinkedList<TreeNode> treeNodeLinkedList new LinkedList<>();if(StringUtils.is…...

PyQt6 QLabel标签控件
锋哥原创的PyQt6视频教程: 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计21条视频,包括:2024版 PyQt6 Python桌面开发 视频教程(无废话…...
即时通讯技术文集(第24期):音视频WebRTC好文合集 [共20篇]
为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第 24 期。 [- 1 -] 开源实时音视频技术WebRTC的现状 [链接] http://www.52im.net/article-126-1.html [摘要] 作为Google开源的技术,WebRTC并不…...

HTML+CSS+JS网页设计与制作摄影类个人网页
可以使用网页三剑客htmlcssjs实现网页设计与制作,页面排版布局高端大气。 使用HTMLCSS页面布局设计,HTMLCSSJS网页设计与制作摄影类个人网页,这是一个优质的个人网页制作。 凭借简约的设计风格、精湛的制作工艺,突破与创新的理念…...

U-boot(五):启动内核
本文主要探讨210的uboot启动内核过程。 嵌入式系统状态启动 未上电时bootloader、kernel、rootfs以镜像形式存储在启动介质中(X210为iNand/SD卡),运行时搬运到DDR中 未上电时u-boot.bin,zImage,rootfs在SD卡中各自对应的分区中,启动时去对应分区寻找(分区表一…...

tp8 使用rabbitMQ(2)工作队列
代码的参数说明在 第一小节的代码中,如果需要可移步到第一节中查看 工作队列 工作队列(又称:任务队列——Task Queues)是为了避免等待一些占用大量资源、时间的操作。当我们把任务(Task)当作消息发送到队列…...

ZKP11.4 Use CI to instantiate Fiat-Shamir
ZKP学习笔记 ZK-Learning MOOC课程笔记 Lecture 11: From Practice to Theory (Guest Lecturer: Alex Lombardi) 11.4 Use CI to instantiate Fiat-Shamir Avoid Bad Challenges Def: Given false claim x x x and a first message α \alpha α, a challenge β \beta …...
华为云编译构建CodeArts Build常见问答汇总
1.【Build】公有云编译构建是否支持导入外部机器做执行机 答:参考链接:https://support.huaweicloud.com/usermanual-devcloud/devcloud_01_0017.html • 使用代理机功能,需要配备1台4U8G或以上规格、磁盘>80GB的主机。 • 安装代理的…...

009 OpenCV 二值化 threshold
一、环境 本文使用环境为: Windows10Python 3.9.17opencv-python 4.8.0.74 二、二值化算法 2.1、概述 在机器视觉应用中,OpenCV的二值化函数threshold具有不可忽视的作用。主要的功能是将一幅灰度图进行二值化处理,以此大幅降低图像的数…...
基于python的NBA球员数据可视化分析的设计与实现
完整下载:基于python的NBA球员数据可视化分析的设计与实现.docx 基于python的NBA球员数据可视化分析的设计与实现 Design and Implementation of NBA Player Data Visualization Analysis based on Python 目录 目录 2 摘要 3 关键词 4 第一章 引言 4 1.1 研究背景 …...

《使用Python将Excel数据批量写入MongoDB数据库》
在数据分析及处理过程中,我们经常需要将数据写入数据库。而MongoDB作为一种NoSQL数据库,其具有强大的可扩展性、高性能以及支持复杂查询等特性,广泛用于大规模数据存储和分析。在这篇文章中,我们将使用Python编写一个将Excel数据批…...

leetcode_828_统计子串中的唯一字符
题意:所有子串中单个字符出现的次数和 问题转化:对于串中的每个字符,只包含其一次的所有子串的个数和 关于求只包含某位置字符一次的子串个数 class Solution { public:int uniqueLetterString(string s) {/* ...A...A...A...*/int n s.size…...

「Java开发中文指南」IntelliJ IDEA插件安装(一)
IntelliJ IDEA是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的Java开发工具,尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能是非常强大的。 插件扩展了Intel…...
单机多卡训练
参考几个不错的帖子(还没来得及整理): 基于pytorch多GPU单机多卡训练实践_多卡训练效果不如单卡-CSDN博客 关于PyTorch单机多卡训练_能用torch.device()实现多卡训练吗-CSDN博客 Pytorch多机多卡分布式训练 - 知乎 (zhihu.com) 当代研究生…...

数据库基础教程之数据库的创建(一)
双击打开Navicat,点击:文件-》新建连接-》PostgreSQL 在下图新建连接中输入各参数,然后点击:连接测试,连接成功后再点击确定。 点击新建数据库 数据库设置如下:...

Python教程:DataFrame列数据类型的转换
Pandas提供了多种数据类型转换方法。可以使用astype()函数来转换数据类型。例如,可以将字符串类型的列转换为整数类型的列: # Author : 小红牛 # 微信公众号:wdPython import pandas as pd# 创建包含字符串类型列的DataFrame df pd.DataFra…...
4-Python与设计模式--抽象工厂模式
4-Python与设计模式–抽象工厂模式 一、快餐点餐系统 想必大家一定见过类似于麦当劳自助点餐台一类的点餐系统吧。在一个大的触摸显示屏上, 有三类可以选择的上餐品: 汉堡等主餐、小食、饮料。当我们选择好自己需要的食物,支付完成后&#…...

STM32 默认时钟更改 +debug调试
STM32时钟 文章目录 STM32时钟前言一、修改系统时钟二、DEBUG 前言 为什么我们要改STM32的时钟呢,打个比方在做SPI驱动的时候,需要16M的时钟,但是stm32默认是72的分频分不出来,这个时候我们就要改系统时钟了,那么怎么…...
转成String类型的几种方式
文章目录 1. String.valueOf()2. 包装类-toString()3. 使用字符串拼接4. 强制类型转换 (String) object5. 总结:6. 基本数据类型和包装类 1. String.valueOf() String.valueOf():基本数据类型或包装类都可以通过 String.valueOf() 方法转为字符串表示形…...
Android BSP 开发之六
1.设定Android settings中某个xml文件(包括其子项)或者某个Preference不被搜索到 设定某个xml文件(包括子项)不被搜索到 找到该xml文件对应的fragment java文件中的SEARCH_INDEX_DATA_PROVIDER,在该provider中对isPageSearchEnabled方法进行重写并…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...

C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...

深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...

C++实现分布式网络通信框架RPC(2)——rpc发布端
有了上篇文章的项目的基本知识的了解,现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...