就是层序遍历,关键在于节点入队列的时候顺序。

原题链接 题目描述:

给定一个二叉树,检查它是否是镜像对称的例如,二叉树[1,2,2,3,4,4,3]是对称的。

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

解题思路:

1. 层序遍历树,将结果压入队列。再比对队列里面的值。每次从队列中出两个值
2. 如图所示,在压入队列中,顺序要改下。左子树的左对应右子树的右
3. 判断节点值是不事相等以及不为空。所有遍历完都相等即相等

golang示例代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
func isSymmetric(root *TreeNode) bool {
    if root == nil {
        return true
    }
    // 初始化时,要将左右入队列,因为后续每次要出两个
    queue := []*TreeNode{root.Left, root.Right}
    for len(queue) > 0 {
        left := queue[0]
        queue = queue[1:]
        right := queue[0]
        queue = queue[1:]
        if left == nil && right == nil {
            continue
        }
        if (left == nil && right != nil) || (left != nil && right == nil) {
            return false
        }
        if left.Val != right.Val {
            return false
        }
        // 先加左子树的左子树
        queue = append(queue, left.Left)
        // 再加右子树的右子树
        queue = append(queue, right.Right)
        // 左子树的右子树
        queue = append(queue, left.Right)
        // 右子树的左子树
        queue = append(queue, right.Left)
    }
    return true
}