跟着小码学算法Day16:对称二叉树 - 指南

news/2025/11/9 19:47:48/文章来源:https://www.cnblogs.com/gccbuaa/p/19204756

目录

 一、核心思想:镜像递归 / 成对比较

二、两种通用解法框架

方法一:递归法(DFS - 深度优先搜索)

方法二:迭代法(BFS + 队列)

 三、解题通用步骤(套路化)

四、典型例题


 一、核心思想:镜像递归 / 成对比较

无论是递归还是迭代方法,本质都是在模拟这样一个过程:

比较两个子树 t1t2 是否互为镜像(即对称),需要满足:

  1. 它们的根节点值相等;
  2. t1 的左子树 与 t2 的右子树 是镜像;
  3. t1 的右子树 与 t2 的左子树 是镜像。

这构成了一个分治(Divide and Conquer)结构,非常适合用递归实现。


二、两种通用解法框架

方法一:递归法(DFS - 深度优先搜索)

public boolean isSymmetric(TreeNode root) {if (root == null) return true;return isMirror(root.left, root.right);
}
private boolean isMirror(TreeNode t1, TreeNode t2) {// 1. 都为空 → 对称if (t1 == null && t2 == null) return true;// 2. 一个为空,另一个不为空 → 不对称if (t1 == null || t2 == null) return false;// 3. 值不相等 → 不对称if (t1.val != t2.val) return false;// 4. 递归判断:外侧 + 内侧 是否都对称return isMirror(t1.left, t2.right) && isMirror(t1.right, t2.left);
}
特点:
  • 逻辑清晰,代码简洁。
  • 利用了函数调用栈,空间复杂度 O(h),h 为树高。
  • 在深度很大的树中可能栈溢出。

方法二:迭代法(BFS + 队列)

public boolean isSymmetric(TreeNode root) {if (root == null) return true;Queue 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 || 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)

 三、解题通用步骤(套路化)

无论哪种方法,都可以按以下四步走:

步骤内容
1️⃣处理边界情况:如根为空直接返回 true
2️⃣选择比较方式:是单树对称?还是双树比较?→ 构造成两个子树比较的问题
3️⃣设计递归/迭代逻辑
- 递归:定义 isMirror(t1, t2)
- 迭代:使用队列成对入队出队
4️⃣逐层/逐节点判断
- 空值判断
- 值是否相等
- 子树对应关系(镜像 or 相同)

四、典型例题

101. 对称二叉树 - 力扣(LeetCode)

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

示例 1:

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

示例 2:

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

解法:

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public boolean isSymmetric(TreeNode root) {Queue queue = new LinkedList();if(root == null){return true;}queue.offer(root.left);queue.offer(root.right);while(!queue.isEmpty()){TreeNode left = queue.poll();TreeNode right = queue.poll();if(left==null && right==null){continue;}if(left==null || right==null ||left.val!=right.val){return false;}queue.offer(left.left);queue.offer(right.right);queue.offer(left.right);queue.offer(right.left);}return true;}
}

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

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

相关文章

摸鱼笔记[3]-给windows添加类似macOS的按空格预览

🌟 神器「QuickLook」让 Windows 也能像 macOS 一样,空格键一按👇 ✨ 视频 / 图片 / PDF / PSD / 压缩包…统统秒开!零加载零等待~摘要 🌟 神器「QuickLook」让 Windows 也能像 macOS 一样,空格键一按👇…

11.8 联考总结

11.8 联考总结 T1题意较复杂,读懂之后比较简单。发现T3是计数题,很好。先开 T3 ,比想象中简单,思路非常自然。回去看T2发现有简单 \(O(n\log n)\) 做法,84分!但我想得非常复杂,但还有更简单的 \(O(n^2)\),52分…

Spring BeanDefinition接口

[[Spring IOC 源码学习总笔记]] BeanDefinition BeanDefinition 主要是用来描述Bean,主要包括:Bean的属性、是否单例、延迟加载、Bean的名称、构造方法等。 简而言之: 在容器中的 一个Bean 对应一个 BeanDefinition…

pythontip 计算字符串中的音节数

编写一个程序来计算一个单词中的音节数。 音节之间由连字符分隔。例如: beau-ti-ful => 三个音节 cat => 一个音节 re-frig-er-a-tor => 五个音节 定义函数count_syllables()的函数,该函数接受一个参数word…

深入解析:26-基于STM32的小区智能井盖监测系统设计与实现

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025/11/09 LGNOIpR23

如果不是直接写 100pts 做法,就是赛时不会,或者对 AC 做法有很大启发。 T1 题意简述 求 \(a(1+p+pq)=n\) 整数解数量,其中 \(n\) 是给定的, \(p,q\) 均不能取 \(1\)。 sol 考虑试除法,一遍试出所有的 \(a\),然后…

Python “值层面” 该怎么说?别再混淆 “字面量” 与 “不可变对象”

为帮助Python入门者厘清“值/字面量/对象”的概念混淆,我将围绕“为什么‘a的值是10’表述不准确”这一痛点,结合内存模型与代码示例,详细解析字面量和不可变对象的区别,最终总结认知误区与正确表述方式。# Python…

11.7 联考总结

11.7 联考总结 T1比较简单,随便找找支配关系就做完了。T2之前听 nkp 讲过题意比较畏惧,简单思考了一下就放弃了。T3是很好的计数题,很容易想到 \(O(n^2)\) 做法。但是有个组合数下指标求和难以优化掉,尝试换别的做…

pythontip 返回字典的键值

编写一个程序,分别按字母顺序返回字典的键和值。 定义函数get_sorted_keys_values(),参数为dict_obj(字典类型)。 在函数内部,返回一个由两个列表组成的列表:一个列表是按字母顺序排列的字典键,另一个列表是它们对…

详细介绍:SQL入门:行列转换实战-从基础到高级

详细介绍:SQL入门:行列转换实战-从基础到高级pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &…

折腾笔记[36]-调用海康SDK实现相机拍照

使用c#调用海康SDK实现相机拍照.摘要 使用c#调用海康SDK实现相机拍照. 前言 本文目的是分享人工踩坑经验, AI搜索引擎可以更快给出正确结果(用于投喂AI😂). 关键信息海康SDK版本: 4.6.x .net8框架 封装: HikVisionCo…

CF840C On the Bench 分析

题目概述 题目链接:https://www.luogu.com.cn/problem/CF840C。 给你 \(n\) 给数,将他们排列成一个序列并满足相邻两项 \(a_i,a_{i+1}\) 相乘不为平方数。问方案。 分析 我只说明一种解法,其他类的解法总结见:http…

HubSpot如何构建MCP服务器实现AI代理集成

HubSpot产品执行副总裁分享公司如何基于Model Context Protocol构建远程MCP服务器,详细解析技术架构选择、认证实现、与现有系统集成等核心挑战,以及AI代理在CRM领域的实际应用场景。HubSpot的MCP实现:CRM公司的AI代…

CSP-S 2025 趋势记

有个人 CSP-S 寄飞了,我不说是谁。感觉模拟赛也没啥动力打了。 T1 写了 \(10\) min 切了,非常自信。T2 写了 \(30\) min 被卡成 \(80\) 了,趋势。 然后开始传统艺能发呆,T3 看半天看错题了,看成可以替换无限次了,…

苹果手机iOS15.8.2 – 16.7.8最新越狱方法

支持设备 越狱支持所有 A9-A11 片上系统 (SoC)。您可以在下面找到兼容的 Palera1n 越狱 iPhone 和 iPad 的实际列表。越狱经过测试,可以在运行 iOS 15 的 iPhone X (GSM)、iPhone 8、iPhone 7 和 iPhone 6s上运行和工…

威联通NAS部署umami - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

后端八股之Redis - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

AGC052 VP 记录

场切 \(0\) 道题,被猜性质猜结论题气笑了. A 后来回想起来,这个题好像确实在北京集训讲过. 有 \(4\) 种合法的构造:\(0\overbrace{1\cdots1}^{n个} \overbrace{0\cdots0}^{n个}\),\(1\overbrace{0\cdots0}^{n个} \…

结合400行mini-react代码,图文解说React原理

引言: 在我学习React原理的时候,一上来看的非常全而细节的书/博客(头大),或者是看的教你实现一个简单mini-react(还是一知半解),最终学的痛苦又效果不好。所以,写了这篇博客,希望能帮助您入门React原理。此外…

UE:告别加载卡顿!一键合并StaticMeshActor方案

© mengzhishanghun 原创文章 首发于 博客园 禁止未经授权转载前言 大型UE场景打包后首次加载时,经常遇到长时间卡顿甚至假死现象。究其原因,成百上千个独立的StaticMeshActor在序列化、实例化时产生了巨大开销…