题目

给定一个二叉树,检查它是否是镜像对称的。

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

  1. 1
  2. / \
  3. 2 2
  4. / \ / \
  5. 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
}
  • 层序遍历每一行,对每一行判断是否对称

原文

https://leetcode-cn.com/explore/learn/card/data-structure-binary-tree/3/solve-problems-recursively/13/