leetcode 链接:101. 对称二叉树

题目

给定一个二叉树,检查它是否是镜像对称的。

示例:

  1. 二叉树 [1,2,2,3,4,4,3] 是对称的。
  2. 1
  3. / \
  4. 2 2
  5. / \ / \
  6. 3 4 4 3
[1,2,2,null,3,null,3] 则不是镜像对称的:
    1
   / \
  2   2
   \   \
   3    3

解答 & 代码

解法一:层序遍历

层序遍历得到每层的节点列表 levelNodes ,使用双指针从 levelNodes 左右两端往里移动,比较两端是否相等,如果有不相等的,返回 false

/**
 * 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 == nullptr)
            return true;

        queue<TreeNode*> nodeQ;
        nodeQ.push(root);
        while(!nodeQ.empty())    // 层序遍历
        {
            int size = nodeQ.size();
            vector<TreeNode*> levelNodes;    // 存储当前层的节点(包括 nullptr)
            for(int i = 0; i < size; ++i)
            {
                TreeNode* cur = nodeQ.front();
                nodeQ.pop();
                levelNodes.push_back(cur);
                if(cur != nullptr)
                {
                    nodeQ.push(cur->left);
                    nodeQ.push(cur->right);
                }
            }

            // 双指针判断当前层的节点是否对称
            int left = 0, right = levelNodes.size() - 1;
            while(left <= right)
            {
                if((levelNodes[left] == nullptr && levelNodes[right] != nullptr) ||
                    (levelNodes[left] != nullptr && levelNodes[right] == nullptr) ||
                    (levelNodes[left] != nullptr && levelNodes[right] != nullptr && levelNodes[left]->val != levelNodes[right]->val)) 
                    return false;
                ++left;
                --right;
            }
        }
        return true;
    }
};

执行结果:

执行结果:通过

执行用时:0 ms, 在所有 C++ 提交中击败了 100.00% 的用户
内存消耗:16.3 MB, 在所有 C++ 提交中击败了 5.03% 的用户

解法二:递归

/**
 * 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 {
private:
    // 递归比较两棵树是否对称
    bool isTwoTreeSymmetric(TreeNode* root1, TreeNode* root2)
    {
        // 递归结束条件:若两个节点都为空,则返回 true,若一个为空一个不为空则返回 false
        if(root1 == nullptr && root2 == nullptr)
            return true;
        else if(root1 == nullptr || root2 == nullptr)
            return false;

        // 只有同时满足以下三个条件才对称
        return root1->val == root2->val &&                             // 根节点值相同
                isTwoTreeSymmetric(root1->left, root2->right) &&     // root1左子树和root2右子树对称
                isTwoTreeSymmetric(root1->right, root2->left);        // root1右子树和root2左子树对称
    }
public:
    bool isSymmetric(TreeNode* root) {
        if(root == nullptr)
            return true;

        return isTwoTreeSymmetric(root->left, root->right);
    }
};
执行结果:通过

执行用时:4 ms, 在所有 C++ 提交中击败了 86.33% 的用户
内存消耗:15.9 MB, 在所有 C++ 提交中击败了 66.02% 的用户