请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。

例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

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

但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

    1
   / \
  2   2
   \   \
   3    3

示例 1:

输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:

输入:root = [1,2,2,null,3,null,3]
输出:false

限制:

0 <= 节点个数 <= 1000

递归:

/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func isSymmetric(root *TreeNode) bool {
if root==nil{
return true
}
return lcc(root.Left,root.Right)
}

func lcc(l *TreeNode,r *TreeNode) bool {
if l==nil&&r==nil{
return true
}else if l==nil||r==nil||l.Val!=r.Val{
return false
}else{
return lcc(l.Left,r.Right)&&lcc(l.Right,r.Left)
}
}

迭代:队列存储左右子树,左子树先左后右,右子树先右后左

/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func isSymmetric(root *TreeNode) bool {
// 队列存储
leftQ,rightQ:=[]*TreeNode{root},[]*TreeNode{root}
for len(leftQ)>0&&len(rightQ)>0 {
l,r:=leftQ[0],rightQ[0]
leftQ, rightQ = leftQ[1:], rightQ[1:]
if l==nil&&r==nil{
continue
}else if l==nil||r==nil||l.Val!=r.Val{
return false
}else {
leftQ=append(leftQ,l.Left,l.Right)
rightQ=append(rightQ,r.Right,r.Left)
}
}
if len(leftQ) == 0 && len(rightQ) == 0 {
return true
} else {
return false
}
}

 

剑指 Offer 28. 对称的二叉树、Leetcode的Go实现_算法