坚持刷题 |对称二叉树

文章目录

  • 题目
  • 考察点
  • 代码实现
  • 实现总结
  • 扩展
    • 用迭代的方式判断是否为对称二叉树
    • 递归和迭代的对比
    • 可能的扩展提问

坚持刷题,老年痴呆追不上我,今天真的好累,就不难为自己了,刷个简单级别的吧:对称二叉树

题目

101.对称二叉树在这里插入图片描述

考察点

  • 递归能力: 能否使用递归来解决问题。
  • 树的基本操作:能否正确地访问节点的值,左子树,右子树等。
  • 边界条件处理: 能否正确处理空树的情况。
  • 镜像对称性的理解: 能否理解对称二叉树的定义。
  • 时间和空间复杂度: 解决问题的方法是否具有合理的时间和空间复杂度。

代码实现

class TreeNode {int val;TreeNode left, right;public TreeNode(int val) {this.val = val;this.left = this.right = null;}
}public class SymmetricBinaryTree {public boolean isSymmetric(TreeNode root) {if (root == null) {return true; // 空树是对称的}return isMirror(root.left, root.right);}private boolean isMirror(TreeNode left, TreeNode right) {if (left == null && right == null) {return true; // 左右子树都为空,是对称的}if (left == null || right == null) {return false; // 一个为空,一个不为空,不对称}// 判断当前节点值相等,并且左子树的左子树与右子树的右子树镜像对称,// 且左子树的右子树与右子树的左子树镜像对称return (left.val == right.val) &&isMirror(left.left, right.right) &&isMirror(left.right, right.left);}public static void main(String[] args) {// 创建一个对称二叉树的例子TreeNode root = new TreeNode(1);root.left = new TreeNode(2);root.right = new TreeNode(2);root.left.left = new TreeNode(3);root.left.right = new TreeNode(4);root.right.left = new TreeNode(4);root.right.right = new TreeNode(3);SymmetricBinaryTree checker = new SymmetricBinaryTree();boolean isSymmetric = checker.isSymmetric(root);System.out.println("Is the tree symmetric? " + isSymmetric);}
}

实现总结

  • 边界条件处理: 空树是对称的。
  • 镜像对称性的理解: 要正确理解对称二叉树的定义,即左子树和右子树镜像对称。
  • 时间复杂度:O(n)。递归的实现是通过深度优先遍历,每个节点只访问一次。在最坏情况下,需要访问二叉树的所有节点,因此时间复杂度是线性的,与节点数成正比。
  • 空间复杂度:O(n)。空间复杂度主要取决于递归调用的深度,因为每一层递归调用都会占用一定的栈空间。在这个对称二叉树的递归实现中,递归调用的深度最多为树的高度。对于平衡二叉树来说,树的高度近似 log(n),其中 n 是节点数。但在最坏情况下,如果二叉树是一条链,树的高度就是节点数 n。

扩展

用迭代的方式判断是否为对称二叉树

使用迭代的方式通常需要借助队列(Queue)来模拟递归的过程。具体思路是利用队列按层遍历二叉树,并逐层判断是否对称:

import java.util.LinkedList;
import java.util.Queue;class TreeNode {int val;TreeNode left, right;public TreeNode(int val) {this.val = val;this.left = this.right = null;}
}
public class SymmetricBinaryTree {public boolean isSymmetric(TreeNode root) {if (root == null) {return true; // 空树是对称的}Queue<TreeNode> queue = new LinkedList<>();queue.offer(root.left);queue.offer(root.right);while (!queue.isEmpty()) {TreeNode leftNode = queue.poll();TreeNode rightNode = queue.poll();if (leftNode == null && rightNode == null) {continue; // 左右子树都为空,继续下一层比较}if (leftNode == null || rightNode == null) {return false; // 一个为空,一个不为空,不对称}if (leftNode.val != rightNode.val) {return false; // 节点值不相等,不对称}// 将左子树的左节点、右子树的右节点和左子树的右节点、右子树的左节点加入队列,以便下一层比较queue.offer(leftNode.left);queue.offer(rightNode.right);queue.offer(leftNode.right);queue.offer(rightNode.left);}return true;}public static void main(String[] args) {// 创建一个对称二叉树的例子TreeNode root = new TreeNode(1);root.left = new TreeNode(2);root.right = new TreeNode(2);root.left.left = new TreeNode(3);root.left.right = new TreeNode(4);root.right.left = new TreeNode(4);root.right.right = new TreeNode(3);SymmetricBinaryTree checker = new SymmetricBinaryTree();boolean isSymmetric = checker.isSymmetric(root);System.out.println("Is the tree symmetric? " + isSymmetric);}
}

在这个实现中,我们使用一个队列来模拟递归的过程,不断将每一层的左子树和右子树的对应节点入队,并比较它们的值。如果出现不对称的情况,直接返回 false。最终,如果队列为空,则说明整个二叉树是对称的,返回 true。

递归和迭代的对比

方式优势劣势
递归简洁、直观 、可读性好栈空间占用,可能导致栈溢出
迭代性能较好代码可能相对冗长,需要显式数据结构维护
  • 如果树规模较小且对代码简洁性有要求,可以选择递归。 递归在解决对称二叉树问题时通常能够提供简洁而清晰的解决方案。
  • 如果树规模较大或者对性能有要求,可以选择迭代。 迭代通常在大规模数据的情况下性能更好,尤其是当树的深度较大时。

可能的扩展提问

是否可以对递归实现进行优化,减少不必要的调用或重复计算呢?

早期终止条件: 在递归函数的开始,可以加入一些早期终止条件,以尽早地判断当前子树是否不对称,从而避免进一步的递归调用。例如,如果左右节点值不相等,可立即返回 false。

private boolean isMirror(TreeNode left, TreeNode right) {if (left == null && right == null) {return true;}if (left == null || right == null || left.val != right.val) {return false;}// 继续递归判断return isMirror(left.left, right.right) && isMirror(left.right, right.left);
}

还有没有其他或者更好的优化思路呢🤔,评论区一起开麦讨论🎤吧

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

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

相关文章

抖音如何引流到小程序-数灵通

当我们在抖音上浏览视频时&#xff0c;有时可能遇到想要分享一个视频到微信或关注视频中的小程序的情况。你可能注意到&#xff0c;这种跳转到微信小程序的功能是如此快速和便捷。那么&#xff0c;你是否想知道实现这个功能的方法呢&#xff1f;本文将介绍一款名为“数灵通”的…

基于springboot+vue的足球青训俱乐部管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 研究背景…

ospf综合实验配置

实验规则如上&#xff1a; 划分ip地址&#xff1a;七个骨干&#xff0c;五个环回 首先划分两个ip&#xff0c;一个给骨干&#xff0c;一个给环回 192.168.1.0/24 -- 1.划分七个骨干网络- 2.划分5个环回网络- 192.168.1.0/25--骨干-----192.168.1.0/28 192.168.1.0 000 0…

图书进销存软件哪个好用?(比较好用的图书进销存软件推荐)

图书进销存软件哪个好用&#xff1f;比较好用的图书进销存软件推荐 我们的目的是&#xff1a;少走弯路&#xff0c;一次到位&#xff01; 因此这篇就分享一个不需要费劲地制作Excel表格&#xff0c;也能搭建出一套进销存管理系统的方法&#xff1a;零代码平台。 本文所用进销…

01、领域驱动设计:微服务设计为什么要选择DDD总结

目录 1、前言 2、软件架构模式的演进 3、微服务设计和拆分的困境 4、为什么 DDD适合微服务 5、DDD与微服务的关系 6、总结 1、前言 我们知道&#xff0c;微服务设计过程中往往会面临边界如何划定的问题&#xff0c;不同的人会根据自己对微服务的理 解而拆分出不同的微服…

【前端可视化】postcss-px-to-viewport 适配怎么限制最大宽度?使用 postcss-mobile-forever

需求原因 自己用 nuxt3 写官网发现用 postcss-px-to-viewport 这个插件虽然能够实现基于 vw 的响应式&#xff0c;但是无法做到限制宽度&#xff0c;比如设计稿 1920p&#xff0c;我只想让最大缩放比例为 1920p&#xff0c;不能超过&#xff0c;就无法实现了。 方案参考 纯 c…

【LeetCode力扣】面试题 17.14. 最小K个数(top-k问题)

目录 1、题目介绍 2、解题思路 2.1、优先队列解法 2.2、top-k问题解法 1、题目介绍 原题链接&#xff1a;面试题 17.14. 最小K个数 - 力扣&#xff08;LeetCode&#xff09; 题目要求非常简短&#xff0c;也非常简单&#xff0c;就是求一组数中的k个最小数。 2、解题思路 …

Power Apps 向Power Automate传一个数组参数

Power Apps传Power Automate数组参数 背景Power Apps传参方法画布开发我们现在power apps中设置一个集合**ArrCollect**准备一个按钮 Power Automate接收总结画布流 背景 我们通常会从Power Apps界面传递参数给Flow中&#xff0c;但是很多时候仅仅是一个字符串类型的已经不适用…

JS之歌词滚动案例

让我为大家带来一个歌词滚动的案例吧&#xff01; 详细的介绍都在代码块中 我很希望大家可以自己动手尝试一下&#xff0c;如果需要晴天的mp3音频文件可以私信我 上代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset&quo…

Java线程池七大参数详解和配置(面试重点!!!)

一、corePoolSize核心线程数 二、maximunPoolSize最大线程数 三、keepAliveTime空闲线程存活时间 四、unit空闲线程存活时间的单位 五、workQueue线程工作队列 1、ArrayBlockingQueue FIFO有界阻塞队列 2、LinkedBlockingQueue FIFO无限队列 3、PriorityBlockingQueue V…

【Conda】超详细的linux-conda环境安装教程

背景 最近被python各个版本环境整的头晕目眩&#xff0c;本来就不是专长做python的&#xff0c;切换各种版本着实不好操作&#xff0c;因此想到了conda这个好工具&#xff0c;以下是对conda的相关理解和搭建的详细过程&#xff0c;做个记录。 Conda简介 Conda是在Windows、m…

CSS 边框

CSS 边框小研究 CSS的边框属它可以让我们随心所欲地控制网页元素的边框样式、宽度和颜色。看下面这张图&#xff0c;是不是能很直观地看到不同边框的效果呀&#xff1f; ## 探索CSS边框的样式 你知道吗&#xff1f;border-style这个属性可以定义出好多种不同的边框样式呢&…