二叉树基础oj题目

二叉树基础oj题目及思路总结

前文中,介绍了二叉树的基本概念及基础操作,进一步对于二叉树的递归遍历及子问题的处理思想有了一定的了解。本文将带来几道二叉树经典的oj题目。

目录

二叉树基础oj题目

  • 对称二叉树
  • 平衡二叉树
  • 二叉树的层序遍历

二叉树基础oj题目

1、对称二叉树

leetcode题目链接
题目描述:给你一个二叉树的根节点 root , 检查它是否轴对称。如下图就是一颗对称二叉树:
在这里插入图片描述
我们可以模拟判断二叉树是不是对称二叉树:
1、对于结点1,左孩子结点为2,右孩子结点为2,目前是对称二叉树。
2、对于1的左孩子结点2,左孩子结点为3,右孩子结点为4, 对于1的右孩子结点2,右孩子结点3,左孩子结点为4,左与右对应,右与左对应,仍是对称二叉树。
可以发现,只要将右子树翻转(左到右,右到左)判断是否与左树相同即可。在总体框架上,仍然使用递归(子问题思路)的方式实现。

 public boolean isSymmetric(TreeNode root) {if(root==null) {return false;}return isSameTree(root.left,invertTree(root.right));}public TreeNode invertTree(TreeNode root) {//翻转二叉树if(root==null) return null;TreeNode tep = root.left;//引入tmp结点交换左右结点root.left = root.right;root.right = tep;invertTree(root.left);//递归实现子树的翻转invertTree(root.right);return root;}public boolean isSameTree(TreeNode p, TreeNode q) {//判断左右树是否相同if(p==null&&q!=null||q==null&&p!=null) {//一个为空,一个不为空必不同return false;}if(p==null&&q==null) {return true;}if(p.val!=q.val) {//值不同,结点必不同return false;}return isSameTree(p.left,q.left)&&isSameTree(p.right,q.right);//递归模拟遍历树}

2、平衡二叉树

leetcode题目链接
给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。下图就是一颗平衡二叉树。
在这里插入图片描述
这道题目有两个思路:

  • 1、自顶向下的递归
  • 2、自底向上的递归

对于自顶向下的递归,需要对于当前遍历到的节点,首先计算左右子树的高度,如果左右子树的高度差不超过1,再分别递归地遍历左右子节点,并判断左子树和右子树是否平衡。这是一个自顶向下的递归的过程。这种递归需要计算每一个结点的高度,时间复杂度较高,为O(N^2)。

而对于自底向上的递归,可以递归地判断其左右子树是否平衡,再判断以当前节点为根的子树是否平衡。如果一棵子树是平衡的,则返回其高度(高度一定是非负整数),否则返回 −1。**如果存在一棵子树不平衡,则整个二叉树一定不平衡。**这种递归方式较为高效,时间复杂度为O(N)。

它们之间的根本区别就是自底向上的递归相较于自顶向下的递归,能够记录下底部的结点构成的子树是不是平衡的,一旦不平衡,就可以直接返回-1,得到这棵树不平衡的结论,可以省去在递归过程中许多重复的计算。下面给出自底向上的递归的代码:

public boolean isBalanced(TreeNode root) {return height(root) >= 0;//不平衡height()返回的是-1}public int height(TreeNode root) {if (root == null) {return 0;}int leftHeight = height(root.left);int rightHeight = height(root.right);if (leftHeight == -1 || rightHeight == -1 //左右子树已经不都平衡,直接返回-1|| Math.abs(leftHeight - rightHeight) > 1) {//从高度上判断树不平衡,返回-1return -1;} else {return Math.max(leftHeight, rightHeight) + 1;//该结点的子树仍平衡,返回最大深度}}

3、二叉树的层序遍历

leetcode题目链接
给你二叉树的根节点 root ,返回其节点值的 层序遍历。(即逐层地,从左到右访问所有节点)。
如下图所示。
在这里插入图片描述
要解决这个问题,似乎我们不能直接通过递归遍历的方式解决。思考一下,第二层的结点都是第一层的根的孩子结点,第三层的根都是第二层的根的孩子结点…而我们打印的顺序也是从上往下打印,有一种先进先出的感觉,这是我们可以考虑使用队列这种数据结构解决问题。
思路:
**对于第一个结点:1、为空,直接return返回。2、不为空,进入队列。
1、循环条件:队列不为空。2、获取队列长度size。3、判断刚入队结点的左孩子结点与右孩子结点,将不为空的结点入队列。4、将size个结点出队列,并输出这些结点的值。当队列为空时,输出结束。**下面是具体代码的呈现:

public List<List<Integer>> levelOrder(TreeNode root) {//返回的实际上是一个二维数组List<List<Integer>> list = new ArrayList<>();if(root==null) {return list;}Queue<TreeNode> q = new LinkedList<>();//队列中放的是结点,泛型规定为TreeNodeq.offer(root);while(!q.isEmpty()) {//队列不为空List<Integer> l = new ArrayList<>();int size = q.size();//获取队列长度while(size!=0) {TreeNode cur = q.poll();l.add(cur.val);if(cur.left!=null) {//判断左孩子是否为空q.offer(cur.left);}if(cur.right!=null) {//判断右孩子是否为空q.offer(cur.right);}size--;}list.add(l);//将一维顺序表加到list中}return list;}

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

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

相关文章

Hadoop3完全分布式搭建

一、第一台的操作搭建 修改主机名 使用hostnamectl set-hostname 修改当前主机名 关闭防火墙和SELlinux 1&#xff0c;使用 systemctl stop firewalld systemctl disable firewalld 关闭防火墙 2&#xff0c;使用 vim /etc/selinux/config 修改为 SELINUXdisabled 使用N…

Vagrant创建Oracle RAC环境示例

利用Vagrant安装Oracle RAC&#xff08;默认为non-CDB模式&#xff09;&#xff0c;生成2台虚机&#xff0c;耗时约1小时。 node1: -----------------------------------------------------------------node1: INFO: 2024-01-11 18:25:54: Make create database commandnode1: …

【C语言深度剖析——第三节(关键字3)】《C语言深度解剖》+蛋哥分析+个人理解

本文由睡觉待开机原创&#xff0c;未经允许不得转载。 本内容在csdn网站首发 欢迎各位点赞—评论—收藏 如果存在不足之处请评论留言&#xff0c;共同进步&#xff01; 目录 1.基本数据类型2.sizeof关键字 前言&#xff1a; 本期我们继续探讨关于C深度解剖这本书相关内容&#…

5 python快速上手

数据类型&#xff08;上&#xff09; 1.整型1.1 定义1.2 独有功能1.3 公共功能1.4 转换1.5 其他1.5.1 长整型1.5.2 地板除 2. 布尔类型2.1 定义2.2 独有功能2.3 公共功能2.4 转换2.5 其他2.5.1 做条件自动转换 3.字符串类型3.1 定义3.2 独有功能&#xff08;18/48&#xff09;练…

MySQL锁机制与优化实践

数据库乐观和悲观锁 乐观锁 比如在数据库中设置一个版本字段&#xff0c;每操作一次&#xff0c;都会将这行对应的版本号1&#xff0c;这样下次更新都会拿到最新的版本号更新&#xff0c;如果一个事务拿到了版本号但是更新前其他人已经将版本号升级了&#xff0c;那么当前事务…

(3)【Python数据分析进阶】Machine-Learning模型与算法应用-线性回归与逻辑回归

目录 一、Linear Regression线性回归应用 应用案例&#xff08;一&#xff09;——自定义数据&#xff08;Custom data&#xff09; 1、下载安装sklearn库 2、导入库函数 3、加载数据集 4、创建线性回归对象 5、模型训练 6、预测结果 7、绘制模型图像 8、应用模型进行…

Python初学者须知(10)初识条件判断

本系列博客主要针对的是Python初学者。Python语言简洁、强大的特性吸引了越来越多的技术人员将他们的项目转移到Python上。目前&#xff0c;Python已经成为计算机行业最流行的编程语言之一。笔者考虑到Python初学者的多元化&#xff08;Python学习者可能是对编程感兴趣的中学生…

vue3+vite创建项目--(傻瓜式教程)

1、运行创建项目命令 # 使用 npm npm create vitelatest # 使用 yarn yarn create vite # 使用 pnpm pnpm create vite剩下的就是启动以及一些配置信息 2、vitevue3路由配置信息 npm install vue-router4在src目录下新建目录叫“router”&#xff0c;新建一个js文件叫“index…

大语言模型无代码构建知识图谱(2)--环境准备

软件环境 需已安装MySQL数据库。需已安装HuggingFists系统&#xff0c;该系统将提供无代码的可视化数据开发环境。通过该系统利用大语言模型辅助知识图谱的构建。HuggingFists系统的安装可参考《HuggingFists-低代码玩转LLM RAG-准备篇》 流程环境 数据文件 进入HuggingFis…

Transformer 可解释性论文整理(超级详细)

Transformer 可解释性论文整理 前段时间想进一步的了解transformer的工作原理&#xff0c;于是找到了几篇可解释性的文章进行阅读&#xff0c;发现了许多比较有趣的现象和结论&#xff0c;对每篇文章都有自己的深度思考和理解&#xff0c;在此记录&#xff0c;欢迎交流。 1. …

Java多线程并发篇----第二十六篇

系列文章目录 文章目录 系列文章目录前言一、什么是 Executors 框架?二、什么是阻塞队列?阻塞队列的实现原理是什么?如何使用阻塞队列来实现生产者-消费者模型?三、什么是 Callable 和 Future?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分…

Halcon 边缘提取

文章目录 算子Halcon edges_image 示例Halcon frei_amp 示例Halcon kirsch_amp示例Halcon sobel_amp示例Halcon sobel_amp 算子示例Halcon sobel_dir 算子示例Halcon close_edges关闭图像间隙示例Halcon close_edges_length关闭图像间隙示例 算子 edges_image 对于图像进行边缘…

(超详细)8-YOLOV5改进-添加EMA意力机制

1、在yolov5/models下面新建一个EMA.py文件&#xff0c;在里面放入下面的代码 代码如下&#xff1a; import torch from torch import nnclass EMA(nn.Module):def __init__(self, channels, factor8):super(EMA, self).__init__()self.groups factorassert channels // sel…

MapReduce基础知识

MapReduce 1、介绍MapReduce ​ MapReduce的思想核心是“分而治之”&#xff0c;适用于大量复杂的任务处理场景&#xff08;大规模数据处理场景&#xff09;。 ​ Map负责“分”&#xff0c;即把复杂的任务分解为若干个“简单的任务”来并行处理。可以进行拆分的前提是这些小…

Docker(一)简介和基本概念:什么是 Docker?用它会带来什么样的好处?

作者主页&#xff1a; 正函数的个人主页 文章收录专栏&#xff1a; Docker 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01; 一、简介 本章将带领你进入 Docker 的世界。 什么是 Docker&#xff1f; 用它会带来什么样的好处&#xff1f; 好吧&#xff0c;让我们带…

IP劫持的危害分析及应对策略

在当今数字化时代&#xff0c;网络安全问题备受关注&#xff0c;其中IP劫持是一种常见而危险的威胁。本文将深入探讨IP劫持的危害&#xff0c;并提供一些有效的应对策略。 第一部分&#xff1a;IP劫持的定义 IP劫持是指黑客通过各种手段获取并篡改目标IP地址的控制权&#xf…

vue3+vite:封装Svg组件

前言 在项目开发过程中&#xff0c;以svg图片引入时&#xff0c;会遇到当hover态时图片颜色修改的场景&#xff0c;我们可能需要去引入另一张不同颜色的svg图片&#xff0c;或者用css方式修改&#xff0c;为了方便这种情况&#xff0c;需要封装svg组件来自定义宽高和颜色&…

react 页签(自行封装)

思路&#xff1a;封装一个页签组件&#xff0c;包裹页面组件&#xff0c;页面渲染之后把数据缓存到全局状态实现页面缓存。 浏览本博客之前先看一下我的博客实现的功能是否满足需求&#xff0c;实现功能&#xff1a; - 页面缓存 - 关闭当前页 - 鼠标右键>关闭当前 - 鼠标右…

Python中类的继承实现

""派生类继承了基类的一切"&#xff0c;这里创建基类曲线&#xff0c;派生类有椭圆。派生类调用基类的方法&#xff0c;只需方法名前加上基类基类名作为前缀&#xff0c;再将派生类的self和其他参数传入。 当派生类与基类有同名的方法时&#xff0c;调用的是派…

Linux中关于head命令详解

head的作用 head用于查看文件的开头部分的内容。 head的参数 -q隐藏文件名-v 显示文件名-c<数目>显示的字节数-n<数目>显示的行数 head的案例 # 查看yum.log前五行内容 head -5 yum.log