一. 题目

二. 思路

1. 反向递归

  • 分别对根的左右儿子,进行根左右、根右左进行遍历,存储遍历的节点,最后比较两个集合即可。

2. 同步递归

3. 迭代

  • 将方法二改为迭代。

三. 代码

1. 反向递归

class TreeNode
{
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode()
    {
    }

    TreeNode(int val)
    {
        this.val = val;
    }

    TreeNode(int val, TreeNode left, TreeNode right)
    {
        this.val = val;
        this.left = left;
        this.right = right;
    }
}

class Solution
{
    static final int INF = Integer.MAX_VALUE;
    final List<Integer> lL = new ArrayList<>(), rL = new ArrayList<>();

    //根左右
    void dfsL(TreeNode u)
    {
        lL.add(u.val);
        TreeNode ls = u.left, rs = u.right;
        if (ls == null) lL.add(INF);
        else dfsL(ls);

        if (rs == null) lL.add(INF);
        else dfsL(rs);
    }

    //根右左
    void dfsR(TreeNode u)
    {
        rL.add(u.val);
        TreeNode ls = u.left, rs = u.right;
        if (rs == null) rL.add(INF);
        else dfsR(rs);

        if (ls == null) rL.add(INF);
        else dfsR(ls);
    }

    public boolean isSymmetric(TreeNode root)
    {
        if (root.left == null && root.right == null)
            return true;
        if (root.left == null && root.right != null || root.left != null && root.right == null)
            return false;
        lL.clear();
        rL.clear();

        dfsL(root.left);
        dfsR(root.right);
        return lL.equals(rL);
    }
}

2. 同步递归

class Solution
{
    boolean dfs(TreeNode ls, TreeNode rs)
    {
        if (ls == null && rs == null) return true;
        if (ls == null || rs == null) return false;
        return ls.val == rs.val && dfs(ls.left, rs.right) && dfs(ls.right, rs.left);
    }

    public boolean isSymmetric(TreeNode root)
    {
        return dfs(root, root);
    }
}

3. 迭代

class Solution
{
    Deque<TreeNode> q = new LinkedList<>();//ArrayDeque不能加入null

    public boolean isSymmetric(TreeNode root)
    {
        TreeNode u, v;
        q.offer(root);
        q.offer(root);
        while (!q.isEmpty())
        {
            u = q.poll();
            v = q.poll();
            if (u == null && v == null) continue;
            if (u == null || v == null || u.val != v.val) return false;
            
            q.offer(u.left);
            q.offer(v.right);

            q.offer(u.right);
            q.offer(v.left);
        }

        return true;
    }
}