使用Go语言判断二叉树是否对称的方法小结

 更新时间:2025年07月29日 08:24:05   作者:程序员爱钓鱼  
二叉树Binary Tree一种特殊的树,是结点的一个有限集合,且所有结点最多有2个子结点,即度只能是0,1,2,判断二叉树是否对称需比较左右子树结构与值,递归法直接对比子节点,迭代法用队列模拟递归,本文通过代码示例讲解的非常详细,需要的朋友可以参考下

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

一、示例

示例 1:

    1
   / \
  2   2
 / \ / \
3  4 4  3

输出:true

示例 2:

    1
   / \
  2   2
   \   \
   3    3

输出:false

二、应用场景

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

三、解题思路

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

我们可以采用两种方法:

方法一:递归判断

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

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

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

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

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

四、Go语言实现

1. 数据结构定义

package main

import "fmt"

type TreeNode struct {
    Val   int
    Left  *TreeNode
    Right *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))           // 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. 1. 判断 N 叉树是否镜像对称:需要成对比较左右子节点;
  2. 2. 输出是否对称的最小修改操作:可结合动态规划思想;
  3. 3. 判断对称层级:例如仅判断前两层是否对称。

九、总结

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

以上就是使用Go语言判断二叉树是否对称的方法小结的详细内容,更多关于Go判断二叉树对称的资料请关注脚本之家其它相关文章!

相关文章

  • go语言中regexp正则表达式的操作实现

    go语言中regexp正则表达式的操作实现

    regexp包支持对字符串的匹配、搜索和替换,它基于RE2正则表达式引擎,该包提供了多个函数来编译正则表达式并进行匹配、查找、替换等操作,下面就来详细的介绍一下regexp正则表达式的实现,感兴趣的可以了解一下
    2025-09-09
  • Go与Redis实现分布式互斥锁和红锁

    Go与Redis实现分布式互斥锁和红锁

    这篇文章主要介绍了Go与Redis实现分布式互斥锁和红锁,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • Go语言MySQLCURD数据库操作示例详解

    Go语言MySQLCURD数据库操作示例详解

    这篇文章主要为大家介绍了Go语言MySQLCURD数据库操作示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Golang WebView跨平台的桌面应用库的使用

    Golang WebView跨平台的桌面应用库的使用

    Golang WebView是一个强大的桌面应用库,本文介绍了Golang WebView的特点和使用方法,并列举示例详细的介绍了其在实际项目中的应用,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • Golang使用Apache PLC4X连接modbus的示例代码

    Golang使用Apache PLC4X连接modbus的示例代码

    Modbus是一种串行通信协议,是Modicon公司于1979年为使用可编程逻辑控制器(PLC)通信而发表,这篇文章主要介绍了Golang使用Apache PLC4X连接modbus的示例代码,需要的朋友可以参考下
    2024-07-07
  • Go使用context控制协程取消的实战案例

    Go使用context控制协程取消的实战案例

    在并发编程中,合理地控制协程的生命周期是保证程序稳定性和资源可控使用的关键,Go语言标准库中的context包正是为了解决这一问题而生,它为我们提供了取消信号、超时控制、请求作用域的值传递等功能,本文将通过一个实际案例,演示如何使用context控制协程的取消
    2025-08-08
  • Golang实现单链表的示例代码

    Golang实现单链表的示例代码

    本文主要介绍了Golang实现单链表的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • 深入了解Go语言中context的用法

    深入了解Go语言中context的用法

    这篇文章主要为大家详细介绍了Go语言中context用法的相关知识,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-07-07
  • go语言中使用ent做关联查询的示例详解

    go语言中使用ent做关联查询的示例详解

    go语言的ent框架是facebook开源的ORM框架,是go语言开发中的常用框架,而关联查询又是日常开发中的常见数据库操作,故文本给出一个使用ent做关联查询的使用示例,需要的朋友可以参考下
    2024-02-02
  • Golang Compare And Swap算法详细介绍

    Golang Compare And Swap算法详细介绍

    CAS算法是一种有名的无锁算法。无锁编程,即不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步,所以也叫非阻塞同步Non-blocking Synchronization
    2022-10-10

最新评论