递推的方法来走,还是使用队列的方法,同时放入root结点的left结点以及right结点
然后一次取出两个结点进行判断,注意判断条件较多,不是只有一个判断val值的大小
同时放入的顺序也有考究,因为是对称二叉树,所以判断的时候也是要对称判断,放入的时候就要考虑,先放入left的left,然后放入right的right,这样这俩拿出来判断大小的时候是判断对称二叉树的,然后让如left的right,放入right的left,理由相同。
/**
* 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 isSymmetric(TreeNode* root) {
if(root==NULL||(root->left==NULL&&root->right==NULL)){
return true;
}
queue<TreeNode*> Q;
Q.push(root->left);
Q.push(root->right);
while(!Q.empty()){
TreeNode* u=Q.front();
Q.pop();
TreeNode* v=Q.front();
Q.pop();
if(u==NULL&&v==NULL){
continue;
}
if(u==NULL||v==NULL){
return false;
}
if(u->val!=v->val){
return false;
}
Q.push(u->left);
Q.push(v->right);
Q.push(u->right);
Q.push(v->left);
}
return true;
}
};
递归的方法不详细阐述,思路差不多,但是不算是特别好想,也容易写错
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, root);
}
};