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

Go语言实战案例-判断二叉树是否对称

给定一棵二叉树,判断这棵树是否是对称的。对称的含义是:这棵树的左子树和右子树在结构上是镜像对称的,且对应节点的值相等。

示例 1:

    1/ \2   2/ \ / \
3  4 4  3输出:true

示例 2:

    1/ \2   2\   \3    3输出:false

二、应用场景

  • • 用户界面或布局中验证左右对称性
  • • 算法竞赛题目或笔试面试常考
  • • 树结构可视化或分析工具中,对称性判断用于简化处理

三、解题思路

本问题的关键在于:比较树的左子树和右子树是否镜像对称

我们可以采用两种方法:

方法一:递归判断

判断左右子树是否满足以下三个条件:

  1. 1. 左子树的左子树和右子树的右子树对称;
  2. 2. 左子树的右子树和右子树的左子树对称;
  3. 3. 当前两个节点值相同。

方法二:迭代判断(借助队列)

使用队列存储成对的节点,每次成对弹出并比较:

  • • 若都为空,继续;
  • • 若一个为空另一个不为空 → 不对称;
  • • 值不相等 → 不对称;
  • • 否则将子节点成对压入队列,继续判断。

四、Go语言实现

1. 数据结构定义

package mainimport "fmt"type TreeNode struct {Val   intLeft  *TreeNodeRight *TreeNode
}

2. 方法一:递归法

func isSymmetric(root *TreeNode) bool {if root == nil {return true}return isMirror(root.Left, root.Right)
}func isMirror(left, right *TreeNode) bool {if left == nil && right == nil {return true}if left == nil || right == nil {return false}if left.Val != right.Val {return false}return isMirror(left.Left, right.Right) && isMirror(left.Right, right.Left)
}

3. 方法二:迭代法(使用队列)

func isSymmetricIterative(root *TreeNode) bool {if root == nil {return true}queue := []*TreeNode{root.Left, root.Right}for len(queue) > 0 {left := queue[0]right := queue[1]queue = queue[2:]if left == nil && right == nil {continue}if left == nil || right == nil || left.Val != right.Val {return false}queue = append(queue, left.Left, right.Right)queue = append(queue, left.Right, right.Left)}return true
}

五、测试样例

func main() {// 构建对称二叉树root := &TreeNode{Val: 1}root.Left = &TreeNode{Val: 2}root.Right = &TreeNode{Val: 2}root.Left.Left = &TreeNode{Val: 3}root.Left.Right = &TreeNode{Val: 4}root.Right.Left = &TreeNode{Val: 4}root.Right.Right = &TreeNode{Val: 3}fmt.Println("递归判断结果:", isSymmetric(root))           // truefmt.Println("迭代判断结果:", isSymmetricIterative(root)) // true
}

六、复杂度分析

方式时间复杂度空间复杂度
递归法O(n)O(h)
迭代法O(n)O(n)
  • • n 表示节点数量;
  • • h 表示树的高度(递归调用栈的深度);
  • • 迭代方法使用了队列,需要额外 O(n) 空间存储节点。

七、可视化理解

将二叉树从中心线对折,看左、右两部分是否完全重合,节点值是否相等。

镜像对称结构满足:

  • • left.Left == right.Right
  • • left.Right == right.Left

八、变种与扩展

  1. 1. 判断 N 叉树是否镜像对称:需要成对比较左右子节点;
  2. 2. 输出是否对称的最小修改操作:可结合动态规划思想;
  3. 3. 判断对称层级:例如仅判断前两层是否对称。

九、总结

内容说明
核心判断条件左右子树是否镜像结构,对应节点值是否相等
递归 vs 迭代递归写法更直观,迭代适合大树或避免栈溢出
技巧点左-右子树配对判断,使用队列模拟递归过程
实用价值面试高频,掌握树结构对称性判断通用技巧

http://www.lryc.cn/news/603311.html

相关文章:

  • 本地安装 SQLite 的详细步骤
  • p5.js 矩形rect绘制教程
  • SpringBoot整合RocketMQ(rocketmq-client.jar)
  • Python day28
  • 【智能协同云图库】智能协同云图库第八弹:基于阿里云百炼大模型—实现 AI 扩图功能
  • 2025年科研算力革命:8卡RTX 5090服务器如何重塑AI研究边界?
  • 0基礎網站開發技術教學(一) --(前端篇)--
  • 思途SQL学习 0729
  • 【CUDA显存不足的问题】
  • ironSource Ads Bidding 现已正式加入TopOn 聚合平台
  • 博弈论03——混合纳什均衡的收益求法
  • 【Linux入坑(一)—全志T133开发板适配欣瑞达LVDS 7寸(800*480)屏幕】
  • 函数对象 vs 函数指针 vs lambda:该用哪个才高效?
  • python学习DAY26打卡
  • Java高级技术知识点
  • GitLab的安装及使用
  • 路由器路由协议详解:从 RIP 到 OSPF 的技术演进
  • 理解Transformer解码器
  • 【术语扫盲】MCU与MPU
  • 《HCIA-Datacom 认证》希赛三色笔记:Vlan间三层通信过程解析
  • 高级08-Java JVM调优:优化你的Java应用
  • 面向对象系统的单元测试层次
  • 医疗AI新基建:MCP与A2A协议的破局与前瞻
  • MySQL——MVCC
  • Django自带的加密算法
  • 汇总10个高质量免费AI生成论文网站,支持GPT4.0和DeepSeek-R1
  • 云端文档管理新纪元:Paperless-ngx与cpolar打造的无边界文件生态
  • PHP性能优化与高并发处理:从基础到高级实践
  • 深入理解Java Map的entrySet()方法
  • VLA--Gemini Robotics On-Device: 将AI带到本地机器人设备上