leetcode 对称二叉树 简单_迭代

 

 

递归:两个对称的节点同时走即可。

迭代:用队列,每一次 push 两个节点,这两个节点是对称的!

// 递归
class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        return _isSymmetric(root, root);
    }

    bool _isSymmetric(TreeNode *node1, TreeNode *node2) {
        if(node1 == nullptr || node2 == nullptr) {
            return node1 == node2;
        }
        if(node1 -> val != node2 -> val) return false;
        bool res = _isSymmetric(node1 -> left, node2 -> right);
        res &= _isSymmetric(node1 -> right, node2 -> left);
        return res;
    }
};
// 迭代
class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if(!root) return false;
        queue<TreeNode *> que;
        que.push(root -> left);
        que.push(root -> right);

        while(!que.empty()) {
            // 取出的 p 和 q 是对称点
            auto p = que.front(); que.pop();
            auto q = que.front(); que.pop();
            if((!p && q) || (p && !q)) return false;    // 一个为 nullptr, 另一个不为 nullptr
            if(!p) continue;    // 两个都为 nullptr
            if(p -> val != q -> val) return false;
            que.push(p -> left);
            que.push(q -> right);
            que.push(p -> right);
            que.push(q -> left);
        }
        return true;
    }
};