サンダーボルト

相手モンスターを全て破壊する。

LeetCode Study : 101. Symmetric Tree

問題

Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).

For example, this binary tree [1,2,2,3,4,4,3] is symmetric:

Example 1:

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

Example 2:

    1
   / \
  2   2
   \   \
   3    3

https://leetcode.com/problems/symmetric-tree/

自分の解答

public boolean isSymmetric(TreeNode root) {
    if (root == null) {
        return true;
    }
    reverseTree(root.left);
    return isSameTree(root.left, root.right);
}

private void reverseTree(TreeNode node) {
    if (node == null) {
        return;
    }
    TreeNode temp = node.left;
    node.left = node.right;
    node.right = temp;
    reverseTree(node.left);
    reverseTree(node.right);
}

private boolean isSameTree(TreeNode p, TreeNode q) {
    if (p == null && q == null) {
        return true;
    }
    if (p == null || q == null) {
        return false;
    }
    return p.val == q.val && isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
}

コード理解

別解

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

public boolean isMirror(TreeNode t1, TreeNode t2) {
    if (t1 == null && t2 == null) return true;
    if (t1 == null || t2 == null) return false;
    return (t1.val == t2.val)
        && isMirror(t1.right, t2.left)
        && isMirror(t1.left, t2.right);
}

Time :  O(n) / Space :  O(n)

これはやられましたね。綺麗です、別解。たしかに、右と左、左と右をどんどん見ていけばいいのか。思いつかなかった。そして理解した。

自分のも意味はわかりやすくていいと思うんだけど。でもまぁ無駄すぎる。細かく言えば別解はTime complexity  O(n)だけど、自分のは O(\frac{3}{2}n)になっちゃってる。

今後のための考え方

  • TreeがMirrorになっているかどうかは right<->left, left<->rightを比較すればよろしい。