请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
例如,二叉树 [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
}
}