leetcode 101.对称二叉树

发布于:2025-03-14 ⋅ 阅读:(21) ⋅ 点赞:(0)

递归

/**
 * 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);
    }
};

好像一般迭代都需要额外的数据结构来存一些数据。但是从理解代码到写出来代码之间感觉差了好远的距离。。我拿捏不了这类算法题。但是又不想放弃。因为还真的挺重要的。多练习,多思考,多做笔记。就这样吧。对称就是让两个指针一个往左边,一个往右边,判断是否相等。把这个逻辑实现清楚就可以了。