递归
/**
* 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 {
public:
bool check(TreeNode *p,TreeNode *q){
if(!p&&!q){
return true;
}
if(!p||!q){
return false;
}
return p->val==q->val&&check(p->left,q->right)&&check(p->right,q->left);
}
bool isSymmetric(TreeNode* root) {
return check(root->left,root->right);
}
};
递归好像比较简单。就是两个指针,判断左子树和右子树是不是完全相等。
迭代
/**
* 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 {
public:
bool check(TreeNode *u,TreeNode *v){
queue<TreeNode*> q;
q.push(u);
q.push(v);
while(!q.empty()){
u=q.front();
q.pop();
v=q.front();
q.pop();
if(!u&&!v){
continue;
}
if((!u||!v)||(u->val!=v->val)){
return false;
}
q.push(u->left);
q.push(v->right);
q.push(u->right);
q.push(v->left);
}
return true;
}
bool isSymmetric(TreeNode* root) {
return check(root,root);
}
};
好像一般迭代都需要额外的数据结构来存一些数据。但是从理解代码到写出来代码之间感觉差了好远的距离。。我拿捏不了这类算法题。但是又不想放弃。因为还真的挺重要的。多练习,多思考,多做笔记。就这样吧。对称就是让两个指针一个往左边,一个往右边,判断是否相等。把这个逻辑实现清楚就可以了。