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;
        }
    };
    
  • 相关阅读:
    《超级迷宫》需求规格说明
    超级迷宫冲刺个人计划安排
    审评(HelloWorld团队)
    C语言中的++与*
    a、b交换
    微服务架构浅析及实践心得
    Servlet版本冲突引起的Error
    并发编程:一个100%会发生死锁的程序
    单元测试与Mockito
    Java基础:HashMap假死锁问题的测试、分析和总结
  • 原文地址:https://www.cnblogs.com/imagineincredible/p/13323095.html
Copyright © 2011-2022 走看看