Given the root of a binary tree, check whether it is a mirror of itself (i.e., symmetric around its center).
Example 1:
Input: root = [1,2,2,3,4,4,3]
Output: true
Example 2:
Input: root = [1,2,2,null,3,null,3]
Output: false
Constraints:
The number of nodes in the tree is in the range [1, 1000].
-100 <= Node.val <= 100
Follow up: Could you solve it both recursively and iteratively?
Solutions
Solution 1: Recursion
Thinking
Symmetry means the left subtree mirrors the right, not that each subtree matches itself. The follow-up asks for both recursion and iteration; \(n \le 1000\), so one pass is enough.
A pair of nodes is symmetric iff their values match and the left child of one mirrors the right child of the other (and vice versa). We therefore start from the root's two children and recurse crosswise.
We design a function \(\textit{dfs}(\textit{root1}, \textit{root2})\) to determine whether two binary trees are symmetric. The answer is \(\textit{dfs}(\textit{root.left}, \textit{root.right})\).
The logic of the function \(\textit{dfs}(\textit{root1}, \textit{root2})\) is as follows:
If both \(\textit{root1}\) and \(\textit{root2}\) are null, the two binary trees are symmetric, and we return true;
If only one of \(\textit{root1}\) and \(\textit{root2}\) is null, or \(\textit{root1.val} \neq \textit{root2.val}\), we return false;
Otherwise, we check whether the left subtree of \(\textit{root1}\) is symmetric with the right subtree of \(\textit{root2}\), and whether the right subtree of \(\textit{root1}\) is symmetric with the left subtree of \(\textit{root2}\), using recursion.
The time complexity is \(O(n)\), and the space complexity is \(O(n)\). Here, \(n\) is the number of nodes in the binary tree.
1 2 3 4 5 6 7 8 910111213141516
# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):# self.val = val# self.left = left# self.right = rightclassSolution:defisSymmetric(self,root:Optional[TreeNode])->bool:defdfs(root1:Optional[TreeNode],root2:Optional[TreeNode])->bool:ifroot1==root2:returnTrueifroot1isNoneorroot2isNoneorroot1.val!=root2.val:returnFalsereturndfs(root1.left,root2.right)anddfs(root1.right,root2.left)returndfs(root.left,root.right)
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */funcisSymmetric(root*TreeNode)bool{vardfsfunc(root1,root2*TreeNode)booldfs=func(root1,root2*TreeNode)bool{ifroot1==root2{returntrue}ifroot1==nil||root2==nil||root1.Val!=root2.Val{returnfalse}returndfs(root1.Left,root2.Right)&&dfs(root1.Right,root2.Left)}returndfs(root.Left,root.Right)}