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

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

示例 1:

arduino 复制代码
    1
   / \
  2   2
 / \ / \
3  4 4  3

输出:true

示例 2:

arduino 复制代码
    1
   / \
  2   2
   \   \
   3    3

输出:false

二、应用场景

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

三、解题思路

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

我们可以采用两种方法:

方法一:递归判断

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

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

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

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

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

四、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

八、变种与扩展

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

九、总结

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

相关推荐
钟离墨笺6 分钟前
Go 语言-->指针
开发语言·后端·golang
前端梭哈攻城狮25 分钟前
dify二开示例
前端·后端·python
该用户已不存在27 分钟前
Node.js 真的取代了PHP吗?
前端·后端·node.js
二闹33 分钟前
OpenCV识物:用代码“认出”物体
后端·opencv
花落人散处36 分钟前
SpringAI——接入高德MCP服务
java·后端
超浪的晨36 分钟前
Java 代理机制详解:从静态代理到动态代理,彻底掌握代理模式的原理与实战
java·开发语言·后端·学习·代理模式·个人开发
天天摸鱼的java工程师38 分钟前
🧠 MySQL 索引结构有哪些?优缺点是什么?【原理 + 场景实战】
java·后端·面试
阿宙ppppp1 小时前
基于yolov5+LPRNet+flask+vue的车牌识别(1)
后端·图像识别
Java水解2 小时前
Spring AI模块化RAG架构解析:三阶段设计与实现详解
后端·spring
蓝倾2 小时前
京东商品SKU数据采集方式及接口说明
前端·后端·api