[leetcode] Symmetric Tree

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.

confused what "{1,#,2,3}" means? > read more on how binary tree is serialized on OJ.

我采用的是层次遍历的思想

class Solution {
public:
	bool isSymmetric(TreeNode *root) {
		// Start typing your C/C++ solution below
		// DO NOT write int main() function
		TreeNode **array=new TreeNode*[10000];
		TreeNode **array1=new TreeNode*[10000];
		memset(array,NULL,sizeof(TreeNode*)*10000);
		memset(array1,NULL,sizeof(TreeNode*)*10000);
		int count1=0,count2=0;
		if(!root)
			return true;
		_leftleveltraverse(root,array,count1);
		_rightleveltraverse(root,array1,count2);
		if(count1!=count2)
			return false;
		for(int i=0 ; i<count1 ; i++){
			if(!array[i] && !array1[i])
				continue;
			if(array[i] && array1[i] && array[i]->val==array1[i]->val)
				continue;
			else
				return false;
		}
		delete []array;
		delete []array1;
		return true;
	}
	void _leftleveltraverse(TreeNode* root, TreeNode **array, int &q){
		array[0]=root;
		int p=0;
		q=1;
		for(;p!=q;p++){
			if(array[p]==NULL)
				continue;
			array[q++]=array[p]->left;
			array[q++]=array[p]->right;
		}
	}
	void _rightleveltraverse(TreeNode* root, TreeNode **array, int &q){
		array[0]=root;
		int p=0;
		q=1;
		for(;p!=q;p++){
			if(array[p]==NULL)
				continue;
			array[q++]=array[p]->right;
			array[q++]=array[p]->left;
		}
	}
};
当然也可以使用递归的思想:

class Solution {
public:
    bool isSymmetric(TreeNode *root) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        if (root == NULL)
            return true;
        return check(root->left, root->right);
    }
    bool check(TreeNode *leftNode, TreeNode *rightNode) {
        if (leftNode == NULL && rightNode == NULL)
            return true;            
        if (leftNode == NULL || rightNode == NULL)
            return false;
            
        return leftNode->val == rightNode->val && check(leftNode->left, rightNode->right) && 
            check(leftNode->right, rightNode->left);
    }
};



你可能感兴趣的:([leetcode] Symmetric Tree)