symmetric tree
// ============================================================
// recursive version
bool is_symmetric_tree(treenode *r1, treenode *r2) {
if(!r1 && !r2) return true;
if(!r1 && r2 || r1 && !r2) return false;
return (r1->val == r2->val && is_symmetric_tree(r1->left, r2->right)
&& is_symmetric_tree(r1->right, r2->left);
}
bool is_symmetric(treenode *r) {
if(!r) return true;
return is_symmetric_tree(r->left, r->right);
}
// ============================================================
// iterative version
bool is_symmetric_tree(treenode *r) {
if(!r) return true;
deque<treenode*> q1, q2;
q1.push_back(r);
while(!q1.empty()) {
while(!q1.empty()) {
treenode *t = q1.front();
q1.pop_front();
if(t == NULL) continue;
q2.push_back(t->left);
q2.push_back(t->right);
}
int i = 0, j = q2.size()-1;
while(i < j) {
if(is_two_nodes_equal(q2[i], q2[j]) == false) return false;
i++;
j--;
}
q1 = q2;
q2.clear();
}
return true;
}
bool is_two_nodes_equal(treenode *n1, treenode *n2) {
if(!n1 && !n2) return true;
if(!n1 && n2 || n1 && !n2) return false;
return n1->val == n2->val;
}