zoukankan      html  css  js  c++  java
  • 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;
        }
    };
    
  • 相关阅读:
    弱爆程序员的特征值
    快捷渐变效果
    做事务性的发布数据库日志会越来越大
    判断MS SQLSERVER临时表是否存在
    SQLite实现加密
    CentOS6.4下安装TeamViewer8
    安装CDT
    CentOS中安装Courier New字体
    VS2012的Windows程序不显示DOS窗口
    log4cpp安装使用
  • 原文地址:https://www.cnblogs.com/imagineincredible/p/13323095.html
Copyright © 2011-2022 走看看