给定一棵二叉树,判断这棵树是否是对称的。对称的含义是:这棵树的左子树和右子树在结构上是镜像对称的,且对应节点的值相等。
示例 1:
arduino
1
/ \
2 2
/ \ / \
3 4 4 3
输出:true
示例 2:
arduino
1
/ \
2 2
\ \
3 3
输出:false
二、应用场景
- • 用户界面或布局中验证左右对称性
- • 算法竞赛题目或笔试面试常考
- • 树结构可视化或分析工具中,对称性判断用于简化处理
三、解题思路
本问题的关键在于:比较树的左子树和右子树是否镜像对称。
我们可以采用两种方法:
方法一:递归判断
判断左右子树是否满足以下三个条件:
-
- 左子树的左子树和右子树的右子树对称;
-
- 左子树的右子树和右子树的左子树对称;
-
- 当前两个节点值相同。
方法二:迭代判断(借助队列)
使用队列存储成对的节点,每次成对弹出并比较:
- • 若都为空,继续;
- • 若一个为空另一个不为空 → 不对称;
- • 值不相等 → 不对称;
- • 否则将子节点成对压入队列,继续判断。
四、Go语言实现
1. 数据结构定义
go
package main
import "fmt"
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
2. 方法一:递归法
go
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. 方法二:迭代法(使用队列)
go
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
}
五、测试样例
ini
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)) // true
fmt.Println("迭代判断结果:", isSymmetricIterative(root)) // true
}
六、复杂度分析
方式 | 时间复杂度 | 空间复杂度 |
---|---|---|
递归法 | O(n) | O(h) |
迭代法 | O(n) | O(n) |
- • n 表示节点数量;
- • h 表示树的高度(递归调用栈的深度);
- • 迭代方法使用了队列,需要额外 O(n) 空间存储节点。
七、可视化理解
将二叉树从中心线对折,看左、右两部分是否完全重合,节点值是否相等。
镜像对称结构满足:
- •
left.Left
==right.Right
- •
left.Right
==right.Left
八、变种与扩展
-
- 判断 N 叉树是否镜像对称:需要成对比较左右子节点;
-
- 输出是否对称的最小修改操作:可结合动态规划思想;
-
- 判断对称层级:例如仅判断前两层是否对称。
九、总结
内容 | 说明 |
---|---|
核心判断条件 | 左右子树是否镜像结构,对应节点值是否相等 |
递归 vs 迭代 | 递归写法更直观,迭代适合大树或避免栈溢出 |
技巧点 | 左-右子树配对判断,使用队列模拟递归过程 |
实用价值 | 面试高频,掌握树结构对称性判断通用技巧 |