Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
For example, this binary tree is symmetric:
1 / \ 2 2 / \ / \ 3 4 4 3
But the following is not:
1 / \ 2 2 \ \ 3 3
Note:
Bonus points if you could solve it both recursively and iteratively.
Bonus points if you could solve it both recursively and iteratively.
Updated Solution (2014.02)
Analysis:
Use two queue to store each level of nodes back and force instead of storing the level.
Use a special node to store the empty node. (-999 in the code below).
Details see the comments in the code below.
Code:
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: bool valid(vector<int> &l){ int i=0; int j=l.size()-1; while (i<j){ if (l[i++]!=l[j--]){return false;} } return true; } bool isSymmetric(TreeNode *root) { vector<int> l; //store the values in current level //q1 and q2 stores the current and next level TreeNodes queue<TreeNode*> q1; queue<TreeNode*> q2; if (!root){return true;} q1.push(root); while ((!q1.empty()) || (!q2.empty())){ // exit only when both queue are empty if (q2.empty()){ // current level is q1 while (!q1.empty()){ // push all the q1 nodes' childeren into q2 TreeNode* tmp = q1.front(); q1.pop(); l.push_back(tmp->val); if (tmp->val!=-999){ // if current node is not a empty node if (tmp->left!=NULL){q2.push(tmp->left);} else{TreeNode* emp = new TreeNode(-999); q2.push(emp);} // store the empty node for the balance checking if (tmp->right!=NULL){q2.push(tmp->right);} else{TreeNode* emp = new TreeNode(-999); q2.push(emp);} } } if (valid(l)==false){return false;}else // all the nodes in current level are stored, check if it is balanced {l.clear();} }else{ //current level is q2 while (!q2.empty()){ // push all the q2 nodes' childeren into q1 TreeNode* tmp = q2.front(); q2.pop(); l.push_back(tmp->val); if (tmp->val!=-999){ if (tmp->left!=NULL){q1.push(tmp->left);} else{TreeNode* emp = new TreeNode(-999); q1.push(emp);} if (tmp->right!=NULL){q1.push(tmp->right);} else{TreeNode* emp = new TreeNode(-999); q1.push(emp);} } } if (valid(l)==false){return false;}else {l.clear();} } } return true; } };
Code(Python):
# Definition for a binary tree node # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: # @param root, a tree node # @return a boolean def valid(self, l): if cmp(l, l[::-1]) == 0: return True else: return False def isSymmetric(self, root): if root == None: return True q1 = [] q2 = [] l = [] q1.append(root) while len(q1) != 0 or len(q2) != 0: if len(q1) == 0: while len(q2) != 0: node = q2.pop(0) l.append(node.val) if node.val != -999: if node.left != None: q1.append(node.left) else: q1.append(TreeNode(-999)) if node.right != None: q1.append(node.right) else: q1.append(TreeNode(-999)) if self.valid(l) == False : return False else: l = [] else: while len(q1) != 0: node = q1.pop(0) l.append(node.val) if node.val != -999: if node.left != None: q2.append(node.left) else: q2.append(TreeNode(-999)) if node.right != None: q2.append(node.right) else: q2.append(TreeNode(-999)) if self.valid(l) == False : return False else: l = [] return True
Updated Solution(2013.09)
Analysis:
BFS is a good way solving this problem, since BFS can get the nodes in every level.
But be careful with the empty nodes in this problem, if they are not well treated, it will effect the result.
Idea here is to save the empty nodes, with a special value (e.g. -999 in my code), and when we get all the nodes in one level, just need to do the testing (like palindrome).
Note that, the node with no children also need save its two "empty" children. If not, consider this example:
2
3 3
4 5 5 4
8 9 9 8
The last level, if you do not store the empty children from 4 and 5 in previous level, it becomes:
[8,9,9,8], which seems a true answer. But, this level here is [#, #, 8, 9, #, #, 9, 8], #!=8, which is a false answer!
Details see the code below:
Code:
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: bool valid(vector<int> a){ int st=0; int ed=a.size()-1; while (st<ed){ if (a[st]!=a[ed]){return false;} else{ st++; ed--;} } return true; } bool isSymmetric(TreeNode *root) { // Start typing your C/C++ solution below // DO NOT write int main() function queue<TreeNode* > q1; queue<int> q2; if (!root){return true;} q1.push(root); q2.push(0); int l=0; vector<int> r; while (!q1.empty()){ if (l==q2.front()){ r.push_back(q1.front()->val); }else{ if (valid(r)==false){return false;} r.clear(); r.push_back(q1.front()->val); l=q2.front(); } if (q1.front()->val==-999){ q1.pop(); q2.pop(); continue; } if (q1.front()->left){ q1.push(q1.front()->left); q2.push(l+1); }else{ TreeNode* tmp = new TreeNode(-999); q1.push(tmp); q2.push(l+1); } if (q1.front()->right){ q1.push(q1.front()->right); q2.push(l+1); }else{ TreeNode* tmp = new TreeNode(-999); q1.push(tmp); q2.push(l+1); } q1.pop(); q2.pop(); } if (!valid(r)){return false;} return true; } };
class Solution {
ReplyDeletepublic:
bool compare(TreeNode * left, TreeNode * right) {
if (left == NULL && right== NULL) return true;
if((left == NULL && right!= NULL) || (left != NULL && right == NULL) ) return false;
if (left->val != right->val) return false;
return (compare(left->left, right->right) && compare(left->right, right->left));
}
bool isSymmetric(TreeNode *root) {
if(root == NULL) return true;
return compare(root->left, root->right);
}
};
I made this way too. The queue method is complex for this question. Basic recursion is easier to do than using queues to store values at each level.
Delete