LeetCode——二叉树篇(四)

 刷题顺序及思路来源于代码随想录,网站地址:https://programmercarl.com 

 二叉树的定义及创建见:

LeetCode ACM模式——二叉树篇(一)_要向着光的博客-CSDN博客

目录

101. 对称二叉树

递归

 使用队列

100. 相同的树

572. 另一棵树的子树

222. 完全二叉树的节点个数

110. 平衡二叉树

257. 二叉树的所有路径


101. 对称二叉树

给你一个二叉树的根节点 root , 检查它是否轴对称。

递归

/*** @author light* @Description 对称二叉树* 给你一个二叉树的根节点 root , 检查它是否轴对称。* @create 2023-08-18 10:28*/
public class IsSymmetricTest {public static void main(String[] args) {Integer[] arr={2,3,3,4,5,5};BinaryTree2 tree2=new BinaryTree2(arr); //按数组方式创建二叉树//递归boolean symmetric = isSymmetric(tree2.root);System.out.println(symmetric);}public static boolean isSymmetric(TreeNode root) {if(root==null){return true;}//递归return compare_Recursion(root.left,root.right);}//递归private static boolean compare_Recursion(TreeNode left, TreeNode right) {if(left!=null&&right==null){return false;} else if (left==null&&right!=null) {return false;} else if (left == null && right == null) {return true;} else if (left.val!=right.val) {return false;}boolean outSide=compare_Recursion(left.left,right.right); //左子树:左;右子树:右boolean inSide=compare_Recursion(left.right,right.left); //左子树:右; 右子树:左boolean isSame=outSide&&inSide;return isSame;}
}

 使用队列

import java.util.Deque;
import java.util.LinkedList;/*** @author light* @Description 对称二叉树* 给你一个二叉树的根节点 root , 检查它是否轴对称。* @create 2023-08-18 10:28*/
public class IsSymmetricTest {public static void main(String[] args) {Integer[] arr={2,3,3,4,5,5};BinaryTree2 tree2=new BinaryTree2(arr); //按数组方式创建二叉树//使用队列System.out.println(isSymmetric_Queue(tree2.root));}//使用队列public static boolean isSymmetric_Queue(TreeNode root) {if(root==null){return true;}Deque<TreeNode> que=new LinkedList<>();que.offer(root.left);que.offer(root.right);while(!que.isEmpty()){TreeNode leftNode=que.pollFirst();TreeNode rightNode=que.pollFirst();if(leftNode==null&&rightNode==null){continue;}if(leftNode!=null&&rightNode==null){return false;} else if (leftNode==null&&rightNode!=null) {return false;} else if (leftNode.val!=rightNode.val) {return false;}que.offer(leftNode.left);que.offer(rightNode.right);que.offer(leftNode.right);que.offer(rightNode.left);}return true;}
}

100. 相同的树

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

/*** @author light* @Description 相同的数* @create 2023-08-18 11:32*/
public class IsSameTreeTest {public static void main(String[] args) {Integer[] p={1,2,3};BinaryTree2 tree1=new BinaryTree2(p); //按数组方式创建二叉树Integer[] q={1,2,3};BinaryTree2 tree2=new BinaryTree2(q); //按数组方式创建二叉树System.out.println(isSameTree(tree1.root, tree2.root));}public static boolean isSameTree(TreeNode p, TreeNode q) {if(p==null&&q==null){return true;}//if(p==null&&q!=null){//	return false;//} else if (p!= null && p== null) {//	return false;//} else if (p.val!= q.val ) {//	return false;//}if(p==null||q==null){return false;}else if(p.val!=q.val){return false;}boolean left=isSameTree(p.left,q.left); //左boolean right=isSameTree(p.right,q.right); //右boolean isSame=left&&right; //中return isSame;}
}

572. 另一棵树的子树

给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。

二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。


/*** @author light* @Description 另一棵树的子树** 给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。* 如果存在,返回 true ;否则,返回 false 。* 二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。* tree 也可以看做它自身的一棵子树。** (思路:要判断一个树 t 是不是树 s 的子树,那么可以判断 t 是否和树 s 的任意子树相等。那么就转化成 100. Same Tree。* 即,这个题的做法就是在 s 的每个子节点上,判断该子节点是否和 t 相等。** 判断两个树是否相等的三个条件是与的关系,即:* 当前两个树的根节点值相等;* 并且,s 的左子树和 t 的左子树相等;* 并且,s 的右子树和 t 的右子树相等。* 而判断 t 是否为 s 的子树的三个条件是或的关系,即:** 当前两棵树相等;* 或者,t 是 s 的左子树;* 或者,t 是 s 的右子树。** 作者:负雪明烛* 链接:https://leetcode.cn/problems/subtree-of-another-tree/solutions/235634/dui-cheng-mei-pan-duan-zi-shu-vs-pan-duan-xiang-de/* 来源:力扣(LeetCode)* 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。* @create 2023-08-18 11:46*/
public class IsSubtreeTest {public static void main(String[] args) {Integer[] root = {1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,2};Integer[] subRoot = {1,null,1,null,1,null,1,null,1,null,1,2};BinaryTree2 tree1=new BinaryTree2(root); //按数组方式创建二叉树BinaryTree2 tree2=new BinaryTree2(subRoot); //按数组方式创建二叉树System.out.println(isSubtree(tree1.root, tree2.root));}public static boolean isSubtree(TreeNode root, TreeNode subRoot) {//判断是否是子树if(root==null&&subRoot==null){return true;}if(root==null||subRoot==null){return false;}return isSameTree(root,subRoot)||isSubtree(root.left,subRoot)||isSubtree(root.right,subRoot);}private static boolean isSameTree(TreeNode s, TreeNode t) {//这里转化为两棵树是否相等if(s==null&&t==null){return true;}if(s==null||t==null){return false;} else if (s.val!= t.val) {return false;}return isSameTree(s.left,t.left)&&isSameTree(s.right,t.right);}
}

222. 完全二叉树的节点个数

给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。

完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。

/*** @author light* @Description 完全二叉树的节点个数** (思路:当完全二叉树只有两种情况,情况一:就是满二叉树,情况二:最后一层叶子节点没有满。** 对于情况一,可以直接用 2^树深度 - 1 来计算,注意这里根节点深度为1。* 对于情况二,分别递归左孩子和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,*		然后依然可以按照情况1来计算。* @create 2023-08-18 14:52*/
public class CountNodesTest {public static void main(String[] args) {Integer[] arr = {1,2,3,4,5,6};BinaryTree2 tree=new BinaryTree2(arr); //按数组方式创建二叉树System.out.println(countNodes(tree.root));}public static int countNodes(TreeNode root) {/*   递归:普通二叉树//if(root==null){//	return 0;//}左//int leftNum=countNodes(root.left);//int rightNum=countNodes(root.right);//int res=leftNum+rightNum+1;//return res;*///完全二叉树if(root==null){return 0;}TreeNode leftNode=root.left;TreeNode rightNode=root.right;int leftDepth=0; //为了便于计算int rightDepth=0;while(leftNode!=null){leftNode=leftNode.left;leftDepth++;}while(rightNode!=null){rightNode=rightNode.right;rightDepth++;}if(leftDepth==rightDepth){return (2<<leftDepth)-1;  //满二叉树结点数计算 ;注意(2<<1) 相当于2^2,}int leftNum=countNodes(root.left);  //左int rightNum=countNodes(root.right); //右int res=leftNum+rightNum+1; //中return res;}
}

110. 平衡二叉树

给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

 

/*** @author light* @Description 平衡二叉树* @create 2023-08-18 16:02*/
public class IsBalancedTest {public static boolean isBalanced(TreeNode root) {if(root==null){return true;}return getHeight(root)!=-1?true:false;}private static int getHeight(TreeNode root) {if(root==null){return 0;}int left=getHeight(root.left);if(left==-1){return -1;}int right=getHeight(root.right);if(right==-1){return  -1;}if(Math.abs(left-right)<=1){//平衡二叉树return 1+Math.max(left,right);}else {return -1;}}
}

257. 二叉树的所有路径

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

叶子节点 是指没有子节点的节点。

import java.util.ArrayList;
import java.util.List;/*** @author light* @Description 二叉树的所有路径* @create 2023-08-18 16:25*/
public class BinaryTreePathsTest {public static List<String> binaryTreePaths(TreeNode root) {List<String> res=new ArrayList<>(); //存放结果if(root==null){return res;}List<Integer> path=new ArrayList<>(); //存放路径变量traversal(root,path,res);return res;}private static void traversal(TreeNode root, List<Integer> path, List<String> res) {path.add(root.val); //前序遍历:中if(root.left==null&&root.right==null){ //遇到叶子结点,及收获结果的时候StringBuilder sb=new StringBuilder();for (int i = 0; i < path.size()-1; i++) {sb.append(path.get(i)).append("->");}sb.append(path.get(path.size()-1));res.add(sb.toString());return;}if(root.left!=null){traversal(root.left,path,res); //前序遍历 左path.remove(path.size()-1);}if(root.right!=null){traversal(root.right,path,res); //前序遍历  右path.remove(path.size()-1);}}
}

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

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

相关文章

无涯教程-Perl - setnetent函数

描述 该函数应在第一次调用getnetent之前调用。 STAYOPEN参数是可选的,在大多数系统上未使用。当getnetent()从网络数据库的下一行检索信息时,setnetent会将枚举设置(或重置)为主机条目集的开头。 语法 以下是此函数的简单语法- setnetent STAYOPEN返回值 此函数不返回任何…

如何使用Redis实现附近商家查询

导读 在日常生活中&#xff0c;我们经常能看见查询附近商家的功能。 常见的场景有&#xff0c;比如你在点外卖的时候&#xff0c;就可能需要按照距离查询附近几百米或者几公里的商家。 本文将介绍如何使用Redis实现按照距离查询附近商户的功能&#xff0c;并以SpringBoot项目…

H13-922题库 HCIP-GaussDB-OLAP V1.5

**H13-922 V1.5 GaussDB(DWS) OLAP题库 华为认证GaussDB OLAP数据库高级工程师HCIP-GaussDB-OLAP V1.0自2019年10月18日起&#xff0c;正式在中国区发布。当前版本V1.5 考试前提&#xff1a; 掌握基本的数据库基础知识、掌握数据仓库运维的基础知识、掌握基本Linux运维知识、…

Git命令详解

1 常用命令 1&#xff09;初始化本地仓库 git init <directory> 是可选的&#xff0c;如果不指定&#xff0c;将使用当前目录。 2&#xff09;克隆一个远程仓库 git clone <url> 3&#xff09;添加文件到暂存区 git add <file> 要添加当前目录中的所…

【Java】2021 RoboCom 机器人开发者大赛-高职组(初赛)题解

7-1 机器人打招呼 机器人小白要来 RoboCom 参赛了&#xff0c;在赛场中遇到人要打个招呼。请你帮它设置好打招呼的这句话&#xff1a;“ni ye lai can jia RoboCom a?”。 输入格式&#xff1a; 本题没有输入。 输出格式&#xff1a; 在一行中输出 ni ye lai can jia Robo…

手把手教你制作印刷包装小程序商城

印刷包装行业越来越受到人们的重视&#xff0c;为了更好地满足消费者的需求&#xff0c;搭建一个专属的小程序商城是一种不错的选择。那么&#xff0c;接下来就让我们一起来学习如何搭建印刷包装小程序商城吧&#xff01; 第一步&#xff1a;登录【乔拓云】网后台&#xff0c;进…

Docker环境安装elasticsearch和kibana

一、安装elasticsearch 创建es-network&#xff0c;让es、kibana在同一个网段&#xff1a; docker network create --driverbridge --subnet192.168.1.10/24 es-network运行elasticsearch docker run -d \ --name elasticsearch \ # 容器名 --hostname elasticsearch # 主机…

iOS开发 - Swift Codable协议实战:快速、简单、高效地完成JSON和Model转换!

前言 Codable 是 Swift 4.0 引入的一种协议&#xff0c;它是一个组合协议&#xff0c;由 Decodable 和 Encodable 两个协议组成。它的作用是将模型对象转换为 JSON 或者是其它的数据格式&#xff0c;也可以反过来将 JSON 数据转换为模型对象。 Encodable 和 Decodable 分别定…

web实现酷炫的canvas粒子动画背景

文章目录 前言一、particle-bg1. git地址&#xff1a;2. 安装3. 使用4. 完整demo 二、tsParticles1. 源码地址&#xff1a;2. 安装3. 引入4. 使用5. 几个例子5.1 ts粒子五彩纸屑烟花5.2 多粒子产卵器-用tsParticles制作5.3 ts粒子鼠标吸引力5.4 粒子烟花 源码地址完结 前言 粒…

【运筹优化】运输问题建模 + Java调用Cplex求解

文章目录 一、问题描述二、思路分析三、建模方案四、Java调用Cplex代码五、输出结果 一、问题描述 运输问题(transportation problem&#xff09;一般是研究把某种商品从若干个产地运至若干个销地而使总运费最小的一类问题。 本博客将根据下面的例题&#xff0c;介绍运输问题…

STM32F407使用Helix库软解MP3并通过DAC输出,最精简的STM32+SD卡实现MP3播放器

只用STM32单片机SD卡耳机插座&#xff0c;实现播放MP3播放器&#xff01; 看过很多STM32软解MP3的方案&#xff0c;即不通过类似VS1053之类的解码器芯片&#xff0c;直接用STM32和软件库解码MP3文件&#xff0c;通常使用了labmad或者Helix解码库实现&#xff0c;Helix相对labm…

WebRTC音视频通话-WebRTC视频自定义RTCVideoCapturer相机

WebRTC音视频通话-WebRTC视频自定义RTCVideoCapturer相机 在之前已经实现了WebRTC调用ossrs服务&#xff0c;实现直播视频通话功能。但是在使用过程中&#xff0c;RTCCameraVideoCapturer类提供的方法不能修改及调节相机的灯光等设置&#xff0c;那就需要自定义RTCVideoCaptur…

到江西赣州ibm维修服务器之旅-联想X3850 x6黄灯故障

2023年08月15日&#xff0c;一位江西赣州工厂客户通过朋友介绍与冠峰售前工程师取得联系&#xff0c;双方对产品故障前后原因沟通的大致情况如下&#xff1a; 服务器型号&#xff1a;Lenovo system x3850 x6 为用户公司erp仓库服务器 服务器故障&#xff1a;正常使用过程中业…

<数据结构与算法>二叉树堆的实现

目录 前言 一、树的概念及结构 1 树的概念 2 树的相关概念 二、二叉树的概念及结构 1.二叉树的概念 2. 特殊的二叉树 3. 二叉树的性质 4.二叉树的存储结构 三、二叉树的顺序结构及实现 1.堆的性质 2.堆的插入 3.堆的实现 堆的结构体 HeapInit 初始化 HeapPush 插入 HeapPop 删…

【C++进阶】继承、多态的详解(多态篇)

【C进阶】继承、多态的详解&#xff08;多态篇&#xff09; 目录 【C进阶】继承、多态的详解&#xff08;多态篇&#xff09;多态的概念多态的定义及实现多态的构成条件&#xff08;重点&#xff09;虚函数虚函数的重写&#xff08;覆盖、一种接口继承&#xff09;C11 override…

solr快速上手:聚合分组查询|嵌套分组指南(十二)

0. 引言 solr作为搜索引擎经常用于各类查询场景&#xff0c;我们之前讲解了solr的查询语法&#xff0c;而除了普通的查询语法&#xff0c;有时我们还需要实现聚合查询来统计一些指标&#xff0c;所以今天我们接着来查看solr的聚合查询语法 1. 常用聚合查询语法 以下演示我们…

面试题-React(一):React是什么?它的主要特点是什么?

探索React&#xff1a;前端开发中的重要角色与主要特点 引言&#xff1a; 在现代前端开发领域&#xff0c;React已经成为最受欢迎和广泛使用的JavaScript库之一。它由Facebook开发并于2013年首次发布。随着时间的推移&#xff0c;React在开发社区中获得了强大的支持和认可。本…

画质提升+带宽优化,小红书音视频团队端云结合超分落地实践

随着视频业务和短视频播放规模不断增长&#xff0c;小红书一直致力于研究&#xff1a;如何在保证提升用户体验质量的同时降低视频带宽成本&#xff1f; 在近日结束的音视频技术大会「LiveVideoStackCon 2023」上海站中&#xff0c;小红书音视频架构视频图像处理算法负责人剑寒向…

基于注意力神经网络的深度强化学习探索方法:ARiADNE

ARiADNE:A Reinforcement learning approach using Attention-based Deep Networks for Exploration 文章目录 ARiADNE:A Reinforcement learning approach using Attention-based Deep Networks for Exploration机器人自主探索(ARE)ARE的传统边界法非短视路径深度强化学习的方…

Python | Package | Python的三种包安装方式(pip/whl/tar.gz)

文章目录 PIP 安装与卸载Source 安装与卸载Whell 安装与卸载 PIP 安装与卸载 pip install xxx pip install xxxversion_numberpip install captcha pip install captcha0.4# XXX/anaconda3/envs/py373/lib/python3.7/site-packages pip uninstall captchaSource 安装与卸载 p…