题目
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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
方案一(递归)
/**
* 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 helper(root.Left, root.Right)
}
func helper(node1, node2 *TreeNode) bool {
// 左节点 和 右节点
if node1 == nil && node2 == nil {
return true
}
if (node1 != nil && node2 == nil) || (node1 == nil && node2 != nil) || (node1.Val != node2.Val) {
return false
}
return helper(node1.Left, node2.Right) && helper(node1.Right, node2.Left)
}
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func isSymmetric(root *TreeNode) bool {
queue := []*TreeNode{root}
for len(queue) > 0 {
length := len(queue)
for i := 0; i < length; i++ {
node1 := queue[i]
node2 := queue[length - i - 1]
if node1 == nil && node2 != nil {
return false
}
if node1 != nil && node2 != nil {
if node1.Val != node2.Val {
return false
}
}
if node1 != nil {
queue = append(queue, node1.Left)
queue = append(queue, node1.Right)
}
}
queue = queue[length:]
}
return true
}
- 层序遍历每一行,对每一行判断是否对称