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:

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


But the following [1,2,2,null,3,null,3] is not:

    1
/ \
2   2
\   \
3    3


Note: Bonus points if you could solve it both recursively and iteratively.

## Solution

import collections

class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None

class Solution:
def isSymmetric(self, root: TreeNode) -> bool:
nodeQueue = collections.deque()

if root != None:
nodeQueue.append(root)

while nodeQueue:
innerLevel = []
for _ in range(len(nodeQueue)):
cur = nodeQueue.popleft()
if cur:
innerLevel.append(cur.val)
else:
innerLevel.append(None)

if cur:
nodeQueue.append(cur.left)
nodeQueue.append(cur.right)

innerEnd = len(innerLevel) - 1
if cur != root and len(innerLevel) % 2 == 1:
return False

for j in range(len(innerLevel)//2):
if innerLevel[j] != innerLevel[innerEnd-j]:
return False

return True


## Test Cases

test = Solution()
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(2)
root.left.left = TreeNode(3)
root.left.right = TreeNode(4)
root.right.left = TreeNode(4)
root.right.right = TreeNode(3)
assert test.isSymmetric(root) == True

root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(2)
root.left.left = None
root.left.right = TreeNode(3)
root.right.left = None
root.right.right = TreeNode(3)
assert test.isSymmetric(root) == False

root = None
assert test.isSymmetric(root) == True
print('All Passed!')


## Big O Analysis

Space Complexity: O(N)

Time Complexity: O(N)