LeetCode—101.对称二叉树(Symmetric Tree)——分析及代码(C++)

LeetCode—101.对称二叉树[Symmetric Tree]——分析及代码[C++]

  • 一、题目
  • 二、分析及代码
    • 1. 递归
      • (1)思路
      • (2)代码
      • (3)结果
    • 2. 队列迭代(优化后)
      • (1)思路
      • (2)代码
      • (3)结果
    • 3. 栈迭代(优化前)
      • (1)思路
      • (2)代码
      • (3)结果
  • 三、其他

一、题目

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

例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

    1
   / \
  2   2
 / \ / \
3  4 4  3

但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

    1
   / \
  2   2
   \   \
   3    3

说明:

如果你可以运用递归和迭代两种方法解决这个问题,会很加分。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/symmetric-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、分析及代码

1. 递归

(1)思路

通过递归,依次遍历左、右子树对称的位置,判断是否对称。

(2)代码

class Solution {
     
public:
    bool isSymmetric(TreeNode* root) {
     
        return isSym(root, root);
    }
    
    bool isSym(TreeNode* ln, TreeNode* rn) {
     
        if (ln == NULL && rn == NULL)
            return true;
        if (ln == NULL || rn == NULL)
            return false;
        return (ln->val == rn->val) && (isSym(ln->left, rn->right)) && (isSym(ln->right, rn->left)); 
    }
};

(3)结果

执行用时 :8 ms, 在所有 C++ 提交中击败了 72.21% 的用户;
内存消耗 :14.8 MB, 在所有 C++ 提交中击败了 85.18% 的用户。

2. 队列迭代(优化后)

(1)思路

用队列成对存储左、右子树中的对称节点,并依次比较。

(2)代码

class Solution {
     
public:
    bool isSymmetric(TreeNode* root) {
     
        queue<TreeNode*> q;
        if (root == NULL)
            return true;
        q.push(root->left);//不直接push根节点:避免后面对左右子树重复计算
        q.push(root->right);
        while (!q.empty()) {
     
            TreeNode* ln = q.front();
            q.pop();
            TreeNode* rn = q.front();
            q.pop();
            if (ln == NULL && rn == NULL)
                continue;
            if (ln == NULL || rn == NULL || ln->val != rn->val)
                return false;
            q.push(ln->left);
            q.push(rn->right);
            q.push(ln->right);
            q.push(rn->left);            
        }
        return true;        
    }
};

(3)结果

执行用时 :0 ms, 在所有 C++ 提交中击败了 100% 的用户;
内存消耗 :14.8 MB, 在所有 C++ 提交中击败了 82.13% 的用户。

3. 栈迭代(优化前)

(1)思路

参考之前中序遍历的写法,对左右子树的对称节点依次遍历。

(2)代码

class Solution {
     
public:
    bool isSymmetric(TreeNode* root) {
     
        bool ans = true;
        if (root == NULL)
            return ans;
        stack<TreeNode*> ls, rs;
        TreeNode* ln = root->left;
        TreeNode* rn = root->right;
        while( ln != NULL || !ls.empty()) {
     
            while (ln != NULL) {
     
                ls.push(ln);
                ln = ln->left;
                if (rn == NULL)
                    return false;
                rs.push(rn);
                rn = rn->right;                
            }
            if (rn != NULL)
                return false;
            ln = ls.top();
            ls.pop();
            rn = rs.top();
            rs.pop();
            if (ln->val != rn->val)
                return false;
            ln = ln->right;
            rn = rn->left;            
        }
        if (rn != NULL)
            return false;
        return true;        
    }
};

(3)结果

执行用时 :8 ms, 在所有 C++ 提交中击败了 72.21% 的用户;
内存消耗 :15 MB, 在所有 C++ 提交中击败了 78.41% 的用户。

三、其他

暂无。

你可能感兴趣的:(数据结构与算法,LeetCode,C++,题解)