LC101 对称二叉树

本来尝试使用层次遍历,发现根本无法解决,原因是层序遍历没有左右子树的信息。
递归也没什么思路,就直接参考官方题解

递归解法

将问题转化为两棵树什么情况下对称?

  • 两个根节点具有相同的值
  • 每个树的右子树和另一棵树的左子树镜像对称

代码如下,值得注意的是下面的判断顺序可以实现先判断两者均为nullptr,两者有一个为nullptr,两者均不为nullptr

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

迭代

这个解法是之前尝试的层次遍历的正确版本,解决了判断子树的信息
通过引入一个队列,每次提取一对节点时,将左节点的左子节点和右节点的右子节点插入队列中,对称插入余下部分。

class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        return check(root, root);
    }
    bool check(TreeNode* left, TreeNode* right){
        queue<TreeNode*> nodes;
        nodes.push(left);
        nodes.push(right);
        while(!nodes.empty()){
            left = nodes.front();
            nodes.pop();
            right = nodes.front();
            nodes.pop();
            if(left == nullptr && right == nullptr)
                continue;
            if((left == nullptr || right == nullptr) || (left->val != right->val))
                return false;
            nodes.push(left->left);
            nodes.push(right->right);
            nodes.push(left->right);
            nodes.push(right->left);
        }
        return true;
    }
};
posted @ 2020-07-16 15:57  imagineincredible  阅读(118)  评论(0编辑  收藏  举报