leetcode

101.对称二叉树

力扣链接

递归法

/**
 * 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 traversal(TreeNode* left, TreeNode* right){
      // left是空指针,left=0,!left为true
      if (!left && !right) return true;
      if (!left || !right) return false;
      if (left->val != right->val) return false;
      return traversal(left->left, right->right) && traversal(left->right, right->left);
    }

    bool isSymmetric(TreeNode* root) {
      return traversal(root, root);
    }
};

迭代法

class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        // 引入队列 将递归改写成迭代
        std::queue<TreeNode*> que;
        que.push(root), que.push(root); // 将根结点构造成对子
        TreeNode *p, *q; // 二叉树的两分叉
        // 分层遍历的标志
        while(!que.empty()){
            p = que.front(), que.pop();
            q = que.front(), que.pop();
            if (!p&&!q) continue;// 区别递归法不能return true; 下面还要判断其他层
            if ((!p||!q)||p->val!=q->val) return false;
            // 不用判断if(que->left) 下次循环中 !p||!q 能筛选 que->left为nullptr
            que.push(q->left), que.push(p->right),
            que.push(q->right), que.push(p->left);
            //除了声明(int a, int b;)外,句中逗号可代替分号分隔,换行也可以
        }
        return true;
    }
};