【LeetCode101】对称二叉树

简介: 一.题目:对称二叉树

一.题目:对称二叉树

image.png


2.算法思想

(1)(递归)

对称的条件:

1.根结点相同

2. r1树的左子树同r2树的右子树,r1树的右子树同r2树的左子树。

所以可以用递归实现,注意结构体指针引用元素要用->而不能用小点


(2)(迭代)

用队列迭代,当队列中每两个连续的结点都是相同值时则互为镜像。该队列的处理:每次提取子树左结点A和右结点B和然后比较,然后将A结点的左结点和B结点的右结点插入队列,将A结点的右结点和B结点的左结点插入队列,直至比较到队列为空位置。


3.代码

(1)递归版本

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if(root==NULL) return true;
        return isSym(root->left,root->right);
    }
    //判断根结点为r1和r2的两棵树是否是对称的
    bool isSym(TreeNode* r1,TreeNode* r2){
        if(r1==NULL&&r2==NULL) return true;//能通过第一行则说明两者都不是空
        if(r1==NULL||r2==NULL) return false;
        //对称的条件:
        //1.根结点相同 2.1树的左子树同2树的右子树(右同)
        return r1->val==r2->val && isSym(r1->left,r2->right)&&isSym(r1->right,r2->left);
    }
};

(2)迭代版本

class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        std::queue<TreeNode*> q;
        q.push(root);
        q.push(root);
        while(!q.empty())//队列空则结束循环
        {
            TreeNode* t1 = q.front();
            q.pop();
            TreeNode* t2 = q.front();
            q.pop();
            if(t1==NULL && t2==NULL)
                continue;//continue跳过这一轮
            if(t1==NULL || t2==NULL)
                return false;//一个空一个不空则结束这层递归
            if(t1->val != t2->val)
                return false;//此时队列中相邻的两个元素不同则return
            q.push(t1->left);
            q.push(t2->right);
            q.push(t1->right);
            q.push(t2->left);
        }
        return true;
    }
};

如果是反转二叉树:

1./**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* mirrorTree(TreeNode* root) {
        if(root == NULL){
            return NULL;
        }
        swap(root->left, root->right);
        mirrorTree(root->left);
        mirrorTree(root->right);
        return root;
    }
};


相关文章
|
Java 数据安全/隐私保护
java中public、private、protected作用范围
该内容是关于Java中访问修饰符的范围总结:`public`(全局访问)、`protected`(同包及子类访问)、默认(同包访问)、`private`(仅本类访问)。
265 6
|
弹性计算 tengine 运维
《阿里云认证的解析与实战-云计算ACP认证》——云计算ACP训练营第4天——一、负载均衡SLB
《阿里云认证的解析与实战-云计算ACP认证》——云计算ACP训练营第4天——一、负载均衡SLB
|
存储
数据在内存中的存储(浮点型)
数据在内存中的存储(浮点型)
181 0
数据在内存中的存储(浮点型)
|
Web App开发 C#
Html Agility Pack (HAP) 应用入门
上一节简单介绍了 Html Agility Pack (HAP):c# HTML 解析利器 。 本节以一个简单的例子说说 Html Agility Pack (HAP)  的应用。 一、下载 or 安装 1、下载 使用 VS 2015 之前的版本,需要将 Html Agility Pack (HAP) 发布版本下载到本地,然后添加引用。
1337 0
|
存储 关系型数据库 测试技术
|
1天前
|
云安全 数据采集 人工智能
古茗联名引爆全网,阿里云三层防护助力对抗黑产
阿里云三层校验+风险识别,为古茗每一杯奶茶保驾护航!
古茗联名引爆全网,阿里云三层防护助力对抗黑产
|
5天前
|
人工智能 中间件 API
AutoGen for .NET - 架构学习指南
《AutoGen for .NET 架构学习指南》系统解析微软多智能体框架,涵盖新旧双架构、核心设计、技术栈与实战路径,助你从入门到精通,构建分布式AI协同系统。
296 142
|
5天前
|
Kubernetes 算法 Go
Kubeflow-Katib-架构学习指南
本指南带你深入 Kubeflow 核心组件 Katib,一个 Kubernetes 原生的自动化机器学习系统。从架构解析、代码结构到技能清单与学习路径,助你由浅入深掌握超参数调优与神经架构搜索,实现从使用到贡献的进阶之旅。
278 139