Java二叉树题目练习

Java二叉题目练习

  • 相同的树
  • 对称二叉树
  • 平衡二叉树
  • 二叉树的最近公共祖先
  • 二叉树的层序遍历
  • 二叉树层序遍历 ||
  • 二叉树遍历

相同的树

二叉树的题目大多数时候就可以采用递归的方法写
因为二叉树是由根左子树和右子树组成,每一棵左子树和右子树又可以被看成一颗完整的树,因此大事化小,小事化了

在这里插入图片描述

目的:就是判断两个树是完全相同
思路:采用递归的方法,因为在二叉树中树是由根、左子树和右子树组成,每一个左子树和右子树又可以被看成一颗完整的树,因此这里重要的是找好递归的截止条件就行

在这里插入图片描述

class Solution {public boolean isSameTree(TreeNode p, TreeNode q) {//都为空的话就返回trueif(p==null&&q==null){return true;}//一个为空,一个不为空的话就返回falseif(p==null&&q!=null||p!=null&&q==null){return false;}//值不相同返回falseif(p.val!=q.val){return false;}//两个不为空且值相同的话就继续递归return isSameTree(p.left,q.left)&&isSameTree(p.right,q.right);}
}

在这里插入图片描述
在这里插入图片描述

对称二叉树

在这里插入图片描述

class Solution {public boolean isSymmetric(TreeNode root) {//为空的话就返回trueif(root==null){return true;}//利用判断是否相同的方法return isSymmetrichild(root.left,root.right);}public boolean isSymmetrichild(TreeNode left,TreeNode right){if(left==null&&right!=null||left!=null&&right==null){return false;}if(left==null&&right==null){return true;}if(left.val!=right.val){return false;}return isSymmetrichild(left.left,right.right)&&isSymmetrichild(left.right,right.left);}
}

平衡二叉树

在这里插入图片描述

目的:一棵树左右深度差不大于1就是平衡二叉树
这里从底到顶进行向上返回
思路:函数Height(root)来求其左子树和右子树深度差
返回值:
如果其深度差<=1:返回当前深度,
如果深度差>1就返回-1
中止条件:
root为空时候,说明找完了,返回当前高度为0
左子树/右子树深度为-1,或者深度差>1就返回-1,说明不是平衡二叉树

在这里插入图片描述

class Solution {public boolean isBalanced(TreeNode root) {if(root==null){return true;}return Height(root)!=-1;      }//求树的深度差public int Height(TreeNode root){if(root==null){return 0;}//求出左子树和右子树int left = Height(root.left);if(left<0){return -1;}int right = Height(root.right);if(right<0){return -1;}if(left>=0&&right>=0&&Math.abs(left-right)<=1){return left>right? left+1:right+1;}else{return -1;}}
}
如果这里不是平衡二叉树,Height函数返回-1,如果是就返回其长度
所有子在isBalanced,只要判断其返回是否是-1就行

在这里插入图片描述
在这里插入图片描述

二叉树的最近公共祖先

在这里插入图片描述

目的:就是一棵二叉树中的两个节点p和q,找这两个节点最近相同的公共祖先
思路:就是在root树的左子树和右子树中找p和q,注意每一颗左子树和右子树又分别是一颗完整的树
截止:找到节点或者root为null
返回值:如果left和right都不为null,那他们的祖先就是root节点
如果left != null ,返回left节点
如果right != null,返回right节点

在这里插入图片描述

class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {//1.判断是否为空if(root==null){return null;}//2.是否找到p或者qif(root==q||root == p){return root;}//3.递归左子树和右子树进行判断TreeNode left = lowestCommonAncestor(root.left,p,q);TreeNode right = lowestCommonAncestor(root.right,p,q);if(left!=null&&right!=null){return root;}else if(left!=null){return left;}else{return right;}}
}

二叉树的层序遍历

在这里插入图片描述

目的:就是层序输出从上到下每一层的节点,这里返回List<List< Integer >>这个二维列表
思路:二维链表就是由许多一维列表组成,确定每一行的一维链表放入二维链表中就行
这里使用Queue队列来完成存放,知道队列先入先出的原则
1.先把root节点放入队列中
2.求出队列长度,确定每一行要出多少数放入一维队列中,出队列
3.判断这个出去的节点左右子树是否为空,不为空的入队列
4.最后将一链表表放入二维链表中
5.当对列为空的时候就结束了

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

注意每次出队列的时候要计算其此时队列长度,这个长度就代表自己这一次要出队列元素个数
class Solution {public  levelOrder(TreeNode root) {//将其层序遍历分开行就行List<List<Integer>> ret = new ArrayList();if(root==null){return ret;}Queue<TreeNode> queue = new LinkedList<>();//先把头节点放进去queue.offer(root);while (!queue.isEmpty()){List<Integer> curRow = new ArrayList();//求队列长度确定出多少队列元素int size = queue.size();while(size!=0){//出队列TreeNode cur = queue.poll();curRow.add(cur.val);//判断出栈的这个左子树和右子树是否为空if(cur.left!=null){queue.offer(cur.left);}if(cur.right!=null){queue.offer(cur.right);}size--;}ret.add(curRow);}return ret;}
}

二叉树层序遍历 ||

在这里插入图片描述

目的:从下到上层序遍历
思路:和上面从上到下的层序遍历思路一样,就是最后一步的将一位链表放入二维链表中采用头插法,这样就会将其反过来了

class Solution {public  levelOrder(TreeNode root) {//将其层序遍历分开行就行List<List<Integer>> ret = new ArrayList();if(root==null){return ret;}Queue<TreeNode> queue = new LinkedList<>();//先把头节点放进去queue.offer(root);while (!queue.isEmpty()){List<Integer> curRow = new ArrayList();int size = queue.size();while(size!=0){//出队列TreeNode cur = queue.poll();curRow.add(cur.val);//判断出栈的这个左子树和右子树是否为空if(cur.left!=null){queue.offer(cur.left);}if(cur.right!=null){queue.offer(cur.right);}size--;}ret.add(curRow);}return ret;}
}

二叉树遍历

在这里插入图片描述

目的:就是给你一个前序遍历字符串(由字母和‘#’构成),’ # '表示的是空格,并中序打印
思路:1.先输入一个字符串
2.创建这棵树
3.中序遍历打印
已知先序遍历:根-》左子树-》右子树
中序遍历:左子树-》根-》右子树

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这里注意要先写构造树的类,这里创建树采用递归
因为每一棵树的左子树和右子树分别可以看成一颗完整的树
这里再递归的时候,每个节点的左子树和右子树回递归,回归的时候回将回归这两个节点链接起来
import java.util.Scanner;
//树的构造方法类
class TreeNode{public char val;public TreeNode left;public TreeNode right;//构造方法给其val赋值public TreeNode(char val){this.val = val;}
}
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 case//1.输入字符串String str = in.nextLine();//2.构建二叉树TreeNode root = creatTree(str);//3.中序遍历打印二叉树inorder(root);}}//确定遍历到那个字符public static int i = 0;public static TreeNode creatTree(String str){char ch = str.charAt(i);TreeNode root = null;if(ch!='#'){//将这个放入树中root = new TreeNode(ch);i++;//指向下一个root.left = creatTree(str);root.right = creatTree(str);}else{i++;}return root;}//打印public static void inorder(TreeNode root){if(root == null){return;}inorder(root.left);System.out.print(root.val+" ");inorder(root.right);}
}

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

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

相关文章

【全网首发】解决coze工作流批量上传excel数据文档数据重复的问题

注意&#xff1a;目前方法将基于前一章批量数据库导入的修改&#xff01;&#xff01;&#xff01;&#xff01;请先阅读上篇文章的操作。抄袭注明来源 背景 上一节说的方法可以批量导入文件到数据库&#xff0c;但是无法解决已经上传的条目更新问题。简单来说&#xff0c;不…

dockerdesktop 重新安装

1、卸载 dockerdesktop 卸载时&#xff0c;最后一步删除镜像文件 会卡住 取消 2、在资源管理器中将镜像文件路径改名 如&#xff1a;e:\docker 修改 e:\docker1 3、重新安装wsl wsl --shutdown 以管理员身份运行hy.bat pushd "%~dp0" dir /b %SystemRoot%\servic…

Linux docker常用命令

1、docker服务相关命令 启动docker服务&#xff1a;systemctl start docker 停止docker服务&#xff1a;systemctl stop docker 重启docker服务&#xff1a;systemctl restart docker 查看docker服务状态&#xff1a;systemctl status docker 设置开机启动docker服务&#xff1…

南京邮电大学金工实习答案

一、金工实习的定义 金工实习是机械类专业学生一项重要的实践课程&#xff0c;它绝非仅仅只是理论知识在操作层面的简单验证&#xff0c;而是一个全方位培养学生综合实践能力与职业素养的系统工程。从本质上而言&#xff0c;金工实习是学生走出教室&#xff0c;亲身踏入机械加…

Java EE初阶——wait 和 notify

1. 线程饥饿 线程饥饿是指一个或多个线程因长期无法获取所需资源&#xff08;如锁&#xff0c;CPU时间等&#xff09;而持续处于等待状态&#xff0c;导致其任务无法推进的现象。 典型场景 优先级抢占&#xff1a; 在支持线程优先级的系统中&#xff0c;高优先级线程可能持续…

MATLAB中heatmap函数

无论对表格还是对矩阵的可视化&#xff0c;都非常好用。 样本特征 高斯核 https://ww2.mathworks.cn/help/matlab/creating_plots/create-heatmap-from-tabular-data.html

win11安装Joplin Server私有化部署(docker)

摘要 本指南将帮助你在 Windows 11 系统 上通过 Docker Docker Compose 完成 Joplin Server 的本地搭建&#xff0c;并实现数据持久化、PostgreSQL 后端支持、用户登录与同步功能。 条件说明✅ 已安装 Docker Desktop for Windows可从 Docker 官网 下载并安装&#xff0c;建议…

嵌入式STM32学习——外部中断EXTI与NVIC的基础练习⭐

按键控制LED灯 按键控制LED的开发流程&#xff1a; 第一步&#xff1a;使能功能复用时钟 第二布&#xff0c;配置复用寄存器 第三步&#xff0c;配置中断屏蔽寄存器 固件库按键控制LED灯 外部中断EXTI结构体&#xff1a;typedef struct{uint32_t EXTI_Line; …

《Deepseek从入门到精通》清华大学中文pdf完整版

资源介绍&#xff1a; 《DeepSeek&#xff1a;从入门到精通》是由清华大学新闻与传播学院新媒体研究中心元宇宙文化实验室的精心撰写的一份专业文档。该文档以通俗易懂的方 式&#xff0c;全面介绍了DeepSeek的使用方法&#xff0c;为用户提供了极具价值的指导。 这份文档内容丰…

Apache Pulsar 消息、流、存储的融合

Apache Pulsar 消息、流、存储的融合 消息队列在大层面有两种不同类型的应用&#xff0c;一种是在线系统的message queue&#xff0c;一种是流计算&#xff0c;data pipeline的streaming高throughout&#xff0c;一致性较低&#xff0c;延迟较差的过程。 存算分离 扩容和缩容快…

JavaScript vs Python 用于 Web Scraping(2025):终极对比指南

1. 引言 在不断发展的 Web Scraping 领域&#xff0c;选择合适的编程语言对于项目的成功至关重要。虽然 JavaScript 和 Python 在 2025 年仍然是 Web Scraping 领域的热门选择&#xff0c;但它们各自具备不同的优势和挑战。 本指南将深入分析 JavaScript 和 Python 的核心特性…

【RocketMQ Broker 相关源码】- NettyRemotingClient 和 NettyRemotingServer

文章目录 1. 前言2. BrokerOuterAPI2.1 NettyRemotingClient2.2 start 启动2.2.1 NettyRemotingClient#start 3. NettyRemotingServer3.1 ClientHousekeepingService3.2 ProducerManager#doChannelCloseEvent3.3 ConsumerManager#doChannelCloseEvent3.3.1 DefaultConsumerIdsC…

C++性能测试工具——AMD CodeAnalyst及其新工具的使用

一、CodeAnalyst及其新的替代工具 与VTune相比&#xff0c;AMD也有自己的性能测试工具&#xff0c;也就是CodeAnalyst。不过目前看&#xff0c;其应该已经有些过时&#xff0c;目前AMD提供了更新的性能测试工具uProf或CodeXL&#xff0c;这些新工具的优点在于对新的硬件架构和…

ProfibusDP主站转modbusTCP网关与ABB电机保护器数据交互

ProfibusDP主站转modbusTCP网关与ABB电机保护器数据交互 在工业自动化领域&#xff0c;Profibus DP&#xff08;Process Field Bus&#xff09;和Modbus TCP是两种常见的通讯协议&#xff0c;它们各自在不同的场合发挥着重要作用。然而&#xff0c;随着技术的发展和应用需求的…

2025.05.17淘天机考笔试真题第三题

&#x1f4cc; 点击直达笔试专栏 &#x1f449;《大厂笔试突围》 &#x1f4bb; 春秋招笔试突围在线OJ &#x1f449; 笔试突围OJ 03. 奇偶平衡树分割问题 问题描述 K小姐是一位园林设计师&#xff0c;她设计了一个由多个花坛组成的树形公园。每个花坛中种植了不同数量的花…

第三十五节:特征检测与描述-ORB 特征

1. 引言:为什么需要ORB? 在计算机视觉领域,特征检测与描述是许多任务(如图像匹配、目标跟踪、三维重建等)的核心基础。传统的算法如SIFT(尺度不变特征变换)和SURF(加速稳健特征)因其优异的性能被广泛应用,但它们存在两个显著问题: 专利限制:SIFT和SURF受专利保护,…

深入解读WPDRRC信息安全模型:构建中国特色的信息安全防护体系

目录 前言1 WPDRRC模型概述2 模型结构详解2.1 预警&#xff08;Warning&#xff09;2.2 保护&#xff08;Protect&#xff09;2.3 检测&#xff08;Detect&#xff09;2.4 响应&#xff08;React&#xff09;2.5 恢复&#xff08;Restore&#xff09;2.6 反击&#xff08;Count…

《算法导论(第4版)》阅读笔记:p82-p82

《算法导论(第4版)》学习第 17 天&#xff0c;p82-p82 总结&#xff0c;总计 1 页。 一、技术总结 1. Matrix Matrices(矩阵) (1)教材 因为第 4 章涉及到矩阵&#xff0c;矩阵属于线性代数(linear algebra)范畴&#xff0c;如果不熟悉&#xff0c;可以看一下作者推荐的两本…

基于Spring Boot和Vue的在线考试系统架构设计与实现(源码+论文+部署讲解等)

源码项目获取联系 请文末卡片dd我获取更详细的演示视频 系统介绍 基于Spring Boot和Vue的在线考试系统。为学生和教师/管理员提供一个高效、便捷的在线学习、考试及管理平台。系统采用前后端分离的架构&#xff0c;后端基于成熟稳定的Spring Boot框架&#xff0c;负责数据处理…

Codeforces Round 1024 (Div.2)

比赛链接&#xff1a;CF1024 A. Dinner Time 只有当 n n n 是 p p p 的倍数而且 n ⋅ q p ̸ m \frac{n \cdot q}{p} \not m pn⋅q​m 时输出 NO&#xff0c;其余情况均满足条件。 时间复杂度&#xff1a; O ( 1 ) O(1) O(1)。 #include <bits/stdc.h> using na…