[leetcode] Symmetric Tree

本文介绍了一种使用层次遍历来检查二叉树是否对称的方法,并提供了递归和迭代两种实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值