1. Problem statement
Given the root of a binary tree, check whether the tree is symmetric around its center.
In simple terms:
A binary tree is symmetric if the left subtree is a mirror of the right subtree.
Example 1: Symmetric Tree
1 / \ 2 2 / \ / \ 3 4 4 3 Output: true
Example 2: Not Symmetric
1 / \ 2 2 \ \ 3 3 Output: false
2. Recursive Java Solution
class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int val) { this.val = val; } } public class SymmetricTree { public boolean isSymmetric(TreeNode root) { if (root == null) return true; return isMirror(root.left, root.right); } private boolean isMirror(TreeNode t1, TreeNode t2) { // Both nodes are null: symmetric if (t1 == null && t2 == null) return true; // Only one is null: not symmetric if (t1 == null || t2 == null) return false; // Check values and mirror children return (t1.val == t2.val) && isMirror(t1.left, t2.right) && isMirror(t1.right, t2.left); } }
3. Explanation
- Compare the left and right nodes
- Then recursively compare:
- left subtree of left node with right subtree of right node
- right subtree of left node with left subtree of right node
4. Iterative Java Solution (Using Queue)
You can also solve this using a queue to avoid recursion.
import java.util.*; public class SymmetricTreeIterative { public boolean isSymmetric(TreeNode root) { if (root == null) return true; Queue<TreeNode> queue = new LinkedList<>(); queue.add(root.left); queue.add(root.right); while (!queue.isEmpty()) { TreeNode t1 = queue.poll(); TreeNode t2 = queue.poll(); if (t1 == null && t2 == null) continue; if (t1 == null || t2 == null) return false; if (t1.val != t2.val) return false; // Add children in mirror order queue.add(t1.left); queue.add(t2.right); queue.add(t1.right); queue.add(t2.left); } return true; } }