请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
1、递归
我开始想的是产生一个镜像的树,然后递归的判断这两个数是否相等,但是这样很麻烦。题解是我们只需传进去两个一样的树,判断左子树是否等于右子树如果一个二叉树是对称的,则假设有两个这样的树,1树的左节点等于2树的右节点1树的右节点等于2树的左节点*
class Solution {
public:
bool equal(TreeNode*pRoot,TreeNode*MpRoot){
if(pRoot==NULL&&MpRoot==NULL)
return true;
if(pRoot==NULL||MpRoot==NULL)
return false;
return (pRoot->val==MpRoot->val)&&(equal(pRoot->left,MpRoot->right))
&&(equal(pRoot->right,MpRoot->left));
}
bool isSymmetrical(TreeNode* pRoot)
{
return equal(pRoot,pRoot);
}
};
2、非递归
思路;bfs大法,在队列中插入类似于两个树的元素,注意插入顺序,和平常的bfs相比,插入四次(对称的插入),删除两次
q.push(tmp1->left);
q.push(tmp2->right);
q.push(tmp1->right);
q.push(tmp2->left);
可以想像为由两个队列,一个插入的原来的树的元素,一个刚好相反。
class Solution {
public:
bool isSymmetrical(TreeNode* pRoot)
{
if (!pRoot)
return true;
queue<TreeNode* > q;
q.push(pRoot->left);
q.push(pRoot->right);
while (!q.empty())
{
TreeNode* tmp1 = q.front();
q.pop();
TreeNode* tmp2 = q.front();
q.pop();
if(tmp1->val!=tmp2->val)
return false;
if (tmp1==NULL&&tmp2==NULL) continue;
if (tmp1==NULL||tmp2==NULL) return false;
q.push(tmp1->left);
q.push(tmp2->right);
q.push(tmp1->right);
q.push(tmp2->left);
}
return true;
}
};