题目描述
给定二叉树,判断是否对称
![](https://img-blog.csdnimg.cn/img_convert/7dd468aa2cf902ffb6b66475f2512633.png)
![](https://img-blog.csdnimg.cn/img_convert/61b9dfd78dcd294eb9a1eeced654c072.png)
回溯法
核心代码:
class Solution {
public:
bool recursion(TreeNode* p1,TreeNode* p2)
{
if(!p1&&!p2) return true;
if(!p1||!p2||p1->val!=p2->val) return false;
bool ret1=recursion(p1->left, p2->right);
bool ret2=recursion(p1->right, p2->left);
return ret1&&ret2;
}
bool isSymmetrical(TreeNode* pRoot) {
if(!pRoot) return true;
return recursion(pRoot->left,pRoot->right);
}
};
双队列层次遍历
核心代码:
class Solution {
public:
bool isSymmetrical(TreeNode* pRoot) {
if(!pRoot) return true;
queue<TreeNode* > q1;
queue<TreeNode* > q2;
q1.push(pRoot->left);
q1.push(pRoot->right);
q2.push(pRoot->right);
q2.push(pRoot->left);
while(!q1.empty()&&!q2.empty())
{
int n=q1.size();
for(int i=0;i<n;++i)
{
TreeNode* cur1=q1.front();
q1.pop();
TreeNode* cur2=q2.front();
q2.pop();
if(!cur1&&!cur2) ;
else if(!cur1||!cur2||cur1->val!=cur2->val) return false;
else
{
q1.push(cur1->left);
q1.push(cur1->right);
q2.push(cur2->right);
q2.push(cur2->left);
}
}
}
return true;
}
};
复杂度
两种方法时间/空间复杂度均为O(n)