对称二叉树(ps:明天开始更新 408笔试面试复习)(那个clip项目得花时间弄简历上,把那个软件的换掉)关键词:diffusion 和clip
思路:
法一:递归
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
bool check(TreeNode*p,TreeNode *q)
{
if(!p&&!q) return true;//同时为空是可以的
if(!p||!q) return false;//一个为空是不可以的
if(p->val==q->val &&check(p->left,q->right)&&check(p->right,q->left)) return true;
else return false;
}
public:
bool isSymmetric(TreeNode* root) {
return check(root,root);
}
};
法二:迭代法
用一个队列,每次同时放两个根节点入队,每次检查队列里相邻俩个结点的值相不相等,不相等就直接返回false, 随后,将这两个结点的左右孩子对应的入队就可以了。
最后队列为空或者出现false就停。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
bool check(TreeNode *u,TreeNode *v)
{
queue <TreeNode *> q;
q.push(u);
q.push(v);
while(!q.empty())
{
auto m=q.front();
q.pop();
auto n=q.front();//每次取两
q.pop();
if(!m&&!n) continue;//两个都为空 可以进行下一次while循环
if(!m||!n) return false;//一个为空,false
if(m->val!=n->val) return false;//不相等 false
//开始放孩子
q.push(m->left);
q.push(n->right);
q.push(m->right);
q.push(n->left);
}
return true;
}
public:
bool isSymmetric(TreeNode* root) {
return check(root,root);
}
};