当前位置: 首页 > news >正文

递归与迭代——力扣101.对称二叉树

力扣101.对称二叉树

在这里插入图片描述


LeetCode 101. 对称二叉树 - 递归与迭代全解析

一、题目描述

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

示例 1:

输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:

输入:root = [1,2,2,null,3,null,3]
输出:false

提示:

  • 树中节点数目范围:[1, 1000]
  • 节点值范围:[-100, 100]

进阶:

  • 你可以运用递归和迭代两种方法解决此问题吗?

二、思路分析

一个二叉树是对称的,当且仅当其左子树是右子树的镜像。
从根节点出发,检查左右子树是否满足:

  1. 左右节点值相等;
  2. 左节点的左子树与右节点的右子树镜像相等;
  3. 左节点的右子树与右节点的左子树镜像相等。

可以用 递归迭代(队列或栈) 实现。


三、解法一:递归法

核心思想:

  • 定义一个辅助函数 isMirror(TreeNode t1, TreeNode t2)

  • 判断 t1 和 t2 是否互为镜像:

    1. t1 和 t2 同时为空,返回 true;
    2. t1 或 t2 为空,返回 false;
    3. t1.val == t2.val 并且 t1.left 与 t2.right、t1.right 与 t2.left 递归镜像相等。

代码实现:

class Solution {public boolean isSymmetric(TreeNode root) {if (root == null) return true;return isMirror(root.left, root.right);}private boolean isMirror(TreeNode t1, TreeNode t2) {if (t1 == null && t2 == null) return true;if (t1 == null || t2 == null) return false;return (t1.val == t2.val)&& isMirror(t1.left, t2.right)&& isMirror(t1.right, t2.left);}
}

在这里插入图片描述

复杂度分析:

  • 时间复杂度:O(n),每个节点访问一次;
  • 空间复杂度:O(h),h 为树的高度,递归栈开销。

四、解法二:迭代法(使用队列)

核心思想:

  • 利用队列存储成对的节点;

  • 每次弹出一对节点 (t1, t2)

    1. 若两者都为空,继续;
    2. 若一方为空或值不相等,返回 false;
    3. 将子节点按照镜像顺序入队:t1.left、t2.right;t1.right、t2.left;
  • 队列为空时返回 true。

代码实现:

import java.util.LinkedList;
import java.util.Queue;class Solution {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 t1 = queue.poll();TreeNode t2 = queue.poll();if (t1 == null && t2 == null) continue;if (t1 == null || t2 == null) return false;if (t1.val != t2.val) return false;queue.offer(t1.left);queue.offer(t2.right);queue.offer(t1.right);queue.offer(t2.left);}return true;}
}

在这里插入图片描述

复杂度分析:

  • 时间复杂度:O(n);
  • 空间复杂度:O(n),队列中最多存储一层节点。

五、方法对比

方法思路核心是否递归时间复杂度空间复杂度特点
递归法镜像递归判断O(n)O(h)简洁直观、易理解
迭代法队列模拟镜像O(n)O(n)无递归栈,面试友好

六、总结

  • 对称二叉树问题本质是检查左右子树是否互为镜像;
  • 递归法逻辑清晰,代码简短;
  • 迭代法利用队列模拟递归过程,适合面试手写;
  • 两种方法时间复杂度相同,空间复杂度依赖树高或节点数。
http://www.dtcms.com/a/494976.html

相关文章:

  • 中扬立库 × 宁波卡帝亚:小家电之乡的仓储革命,破解制造仓储瓶颈
  • Linux《网络基础》
  • 网络层(IP)
  • 近红外相机在半导体制造领域的应用
  • 网站制作 深圳信科网络公司对比网站
  • 百度旗下所有app列表温州seo排名优化
  • 怎样做让百度收录网站域名设计方案翻译
  • 【whistle】whistle的安装和代理配置
  • 智能油脂润滑系统:降低维护成本与提升生产效率的双赢之道
  • CC17-加油站
  • 【办公类-120-01】20251016 UIBOT下载小说做成docx
  • RestTemplate发送Post请求报错:414 URI Too Long
  • 热力图:从逸出数据到宏观模式识别
  • 解决 gf / gau 与 Oh-My-Zsh 别名冲突的两种办法
  • 开源链动2+1模式、AI智能名片与S2B2C商城小程序:社群经济的数字化重构路径
  • 【详解vtkVoxelContoursToSurfaceFilter】:从有序XY平面轮廓生成三维表面
  • 版本控制器Git
  • 网站版建设南通制作企业网站
  • 网站后台管理系统的重要技术指标收录快的门户网站
  • 降本增效:如何用RustFS将企业存储TCO降低50%?
  • 当AI遇到信息系统:以AI+用户推荐的标签生命周期为例——标签为什么需要“死亡“?
  • 数据结构入门 (九):线索的“寻路”指引 —— 详解线索二叉树
  • wordpress 织梦十堰网站优化
  • Vue+ts 如何实现父组件和子组件通信
  • 广告制作网站源码高端网站设计公司
  • cpp-stub工作原理详细举例解析
  • 香港服务器CPU中E5和Gold的区别
  • linux shell编程实战 02 变量与交互式输入
  • 网站下载怎么做如何建一个免费试用网站
  • 【LeetCode热题100(45/100)】二叉树展开为链表