Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > Go判断二叉树对称

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

作者:程序员爱钓鱼

二叉树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)

七、可视化理解

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

镜像对称结构满足:

八、变种与扩展

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

九、总结

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

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

您可能感兴趣的文章:
阅读全文