sundeepblue
5/10/2014 - 8:05 PM

symmetric tree

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;
}