LeetCode——二叉树篇(四)

news2025/5/14 19:56:48

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

 二叉树的定义及创建见:

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

 

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 void main(String[] args) {
		Integer[] arr = {3,9,20,null,null,15,7};
		BinaryTree2 tree=new BinaryTree2(arr); //按数组方式创建二叉树
		System.out.println(isBalanced(tree.root));
	}

	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 void main(String[] args) {
		Integer[] arr = {1,2,3,null,5};
		BinaryTree2 tree=new BinaryTree2(arr); //按数组方式创建二叉树
		List<String> path=binaryTreePaths(tree.root);
		System.out.println(path);
	}
	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.coloradmin.cn/o/895623.html

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

相关文章

【Flink】Flink窗口触发器

数据进入到窗口的时候,窗口是否触发后续的计算由窗口触发器决定,每种类型的窗口都有对应的窗口触发机制。WindowAssigner 默认的 Trigger通常可解决大多数的情况。我们通常使用方式如下,调用trigger()方法把我们想执行触发器传递进去: SingleOutputStreamOperator<Produ…

Python Opencv实践 - 图像高斯滤波(高斯模糊)

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_COLOR) rows,cols,channels img.shape print(rows,cols,channels)#为图像添加高斯噪声 #使用np.random.normal(loc0.0, scale1.0…

NFT Insider #103:The Sandbox 与音乐天才Agoria携手,Intela X宣布与YGG建立合作关系

引言&#xff1a;NFT Insider由NFT收藏组织WHALE Members、BeepCrypto联合出品&#xff0c;浓缩每周NFT新闻&#xff0c;为大家带来关于NFT最全面、最新鲜、最有价值的讯息。每期周报将从NFT市场数据&#xff0c;艺术新闻类&#xff0c;游戏新闻类&#xff0c;虚拟世界类&#…

List Label Standard Reporting Edition Crack

List & Label Standard Reporting Edition Crack List&Label是适用于所有主要开发平台的报告解决方案&#xff0c;提供了强大的报告引擎、灵活的API和功能丰富的报告设计器。只需要几行代码就可以在桌面、web或云应用程序中嵌入List&Label。它允许您的应用程序用户…

keepalived集群

keepalived概述 keepalived软件就是通过vrrp协议来实现高可用功能。 VRRP通信原理 VRRP就是虚拟路由冗余协议&#xff0c;它的出现就是为了解决静态路由的单点故障。 VRRP是通过一种竞选一种协议机制来将路由交个某台VRRP路由器。 VRRP 用IP多播的方式&#xff08;多播地…

优先级队列【C++】

文章目录 priority_queuepriority_queue 使用priority_queue的模拟实现向上调整算法向下调整算法pushpoptopsizeempty 仿函数完整代码 priority_queue 优先队列&#xff08;priority_queue&#xff09;也是队列的一种&#xff0c;priority_queue的接口是和queue的接口是相同的…

一篇文章了解Java spring中bean的生命周期!

一.介绍在Java spring中bean的生命周期 1.什么是 Bean&#xff1f; 我们来看下 Spring Framework 的官方文档&#xff1a; In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean …

xcode14.3更新一系列问题

1. Missing file libarclite_iphoneos.a (Xcode 14.3) 解决方法 Xcode升级到14.3后编译失败&#xff0c;完整错误日志&#xff1a; File not found: /Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphoneo…

OpenCV-Python中的图像处理-GrabCut算法交互式前景提取

OpenCV-Python中的图像处理-GrabCut算法交互式前景提取 Python-OpenCV中的图像处理-GrabCut算法交互式前景提取 Python-OpenCV中的图像处理-GrabCut算法交互式前景提取 cv2.grabCut(img: Mat, mask: typing.Optional[Mat], rect, bgdModel, fgdModel, iterCount, mode…) img…

linux训练深度学习模型:文件基本操作

解压.zip unzip XXX.zip 创建目录&#xff1a; mkdir data 在当前目录下创建下一级目录 移动文件&#xff1a; mv /data1/census.csv /data1/data 要写全目录路径&#xff0c;不然会跑到根目录那里去。 复制文件到当前目录下&#xff0c;并重命名 cp main.py ./main…

CSS基础 知识点总结

一.CSS简介 1.1 CSS简介 ① CSS指的是层叠样式表&#xff0c;用来控制网页外观的一门技术 ② CSS发展至今&#xff0c;经历过CSS1.0 CSS2.0 CSS2.1 CSS3.0这几个版本&#xff0c;CSS3.0是CSS最新版本 1.2 CSS引入方式 ① 在一个页面引入CSS&#xff0c;共有三种方式 外部…

《一个操作系统的实现》windows用vm安装CentOS——从bochs环境搭建到第一个demo跑通

vm安装CentOS虚拟机带有桌面的版本。su输入密码123456。更新yum -y update 。一般已经安装好后面这2个工具&#xff1a;yum install -y net-tools wget。看下ip地址ifconfig&#xff0c;然后本地终端连接ssh root192.168.249.132输入密码即可&#xff0c;主要是为了复制网址方便…

基于SOLIDWORKS配置功能建立塑料模具标准件库

在塑料模具的设计过程中&#xff0c;建立其三维模型对于后续进行CAE分析和CAM加工是非常重要的。除了型腔和型芯以外&#xff0c;塑料模具中的标准件很多&#xff0c;如推杆、导柱、导套、推板、限位钉等&#xff0c;这些对于不同的产品是需要反复调用的。目前&#xff0c;我国…

GWAS-eQTL colocalization analysis workflow

1. The purpose of GWAS-eQTL intergration Is the my variant an eQTL?Is the leading variant of the GWAS and eQTL signal the same?Is my GWAS association of interest driven by an eQTL that may indiciate a functinal mechanism? GWAS locus that colocalized w…

IntelliJ IDEA 官方网站 idea官网 http://www.jetbrains.com/idea/

IntelliJ IDEA 官方网站 idea官网 http://www.jetbrains.com/idea/ Idea下载官网一键直达&#xff1a; 官网一键直达

低代码揭秘:企业开发能力提升的秘诀!

从捷码官网获取的捷码产品体验账号&#xff0c;用浏览器打开下列地址即可&#xff08;推荐电脑端哈&#xff09;&#xff0c;需要自取&#xff1a; http://dev.gemcoder.com/front/development/index.html#/officialLogin?jmcmVnaXN0ZXI9dHJ1ZQ%3D%3D 对于很多软件开发企业来说…

北京筑龙智能物料:企业供应链数字化转型新思路

8月16-18日&#xff0c;由中国物流与采购联合会主办的“2023&#xff08;第十五届&#xff09;物流与供应链数字化发展大会”在贵州省贵阳市召开。北京筑龙智能化事业部总经理、筑龙研究院副院长胡婧玥受邀出席&#xff0c;带来主题为“智能物料——企业供应链数字化转型新思路…

Windows定时任务计划无法显示任务程序界面的问题解决

笔者这两天写了一个python脚本程序&#xff0c;用来自动从公司的主数据系统获取数据&#xff0c;并按格式编制成excel。脚本程序编写一切顺利&#xff0c;运行结果很是完美&#xff0c;笔者很是舒心。但在最后一步&#xff0c;用上班的电脑每天早上定时运行它时&#xff0c;出了…

msvcp110.dll丢失原因,msvcp110.dll丢失修复方法

装好软件或游戏之后&#xff0c;一打开就跳出各种报错信息的情况小伙伴一定见过&#xff0c;其中缺少各种msvcp110.dll文件最常见。小伙伴们一定奇怪&#xff0c;用得好好的电脑&#xff0c;怎么会缺文件呢&#xff1f;为啥其他游戏/应用就没事呢&#xff1f;其实这些“丢失”的…

Python OpenGL环境配置

1.Python的安装请参照 Anconda安装_安装anconda_lwb-nju的博客-CSDN博客anconda安装教程_安装ancondahttps://blog.csdn.net/lwbCUMT/article/details/125322193?spm1001.2014.3001.5501 Anconda换源虚拟环境创建及使用&#xff08;界面操作&#xff09;_anconda huanyuan_l…