当前位置: 首页 > news >正文

【牛客刷题-算法】NC16 对称的二叉树

个人主页:清风莫追
系列专栏:牛客刷题——数据结构与算法
推荐一款面试、刷题神器牛客网:👉点击加入刷题大军👈

文章目录

  • 1.题目描述
  • 2.算法设计思路
  • 3.算法实现
  • 4.运行结果
  • 结束语:


1.题目描述

描述
给定一棵二叉树,判断其是否是自身的镜像(即:是否对称)
例如:
下面这棵二叉树是对称的
在这里插入图片描述

下面这棵二叉树不对称。
在这里插入图片描述

数据范围:节点数满足 0 ≤ n ≤ 1000 0 \le n \le 1000 0n1000,节点上的值满足 ∣ v a l ∣ ≤ 1000 |val| \le 1000 val1000
要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)
备注:你可以用递归和迭代两种方法解决这个问题

2.算法设计思路

我采用的递归方法。

对称的二叉树将具有一个特性

  • 根->左->右根->右->左 的遍历方法,将得到相同的遍历序列。

而不对称的二叉树则不具有这样的特性(设遍历序列包含空的结点)。

算法过程:

  • 采用 根->左->右根->右->左 的顺序分别遍历二叉树,同时存下各自的遍历序列
  • 逐个元素比较得到的两个序列
  • 若序列相同,返回 true;否则返回 false

例如
对于二叉树在这里插入图片描述

根->左->右 顺序遍历: 1 , 2 , # , 3 , # , # , 2 , # , 3 , # , # 1,2,\#,3,\#,\#,2,\#,3,\#,\# 1,2,#,3,#,#,2,#,3,#,#
根->右->左 顺序遍历: 1 , 2 , 3 , # , # , # , 2 , 3 , # , # , # 1,2,3,\#,\#,\#,2,3,\#,\#,\# 1,2,3,#,#,#,2,3,#,#,#

3.算法实现

注:这里并不是完整代码,而只是核心代码的模式


/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
const int BIG_NUM = 6666;//空结点处的填充值

class Solution {
public:
	//遍历二叉树,同时将遍历结果存入数组 a
    //i:迭代数组a的下标,flag:决定遍历的顺序(从左到右、从右到左)
    void scan(TreeNode* root, int & i, int a[], bool flag){
        if(root == NULL) {
            a[i++] = BIG_NUM;
            return;
        }
        a[i++] = root->val;
        if(flag){
            scan(root->left, i, a, flag);
            scan(root->right, i, a, flag);
        }
        else{
            scan(root->right, i, a, flag);
            scan(root->left, i, a, flag);
        }
        return;
    }
	//判断传入的二叉树是否为自身的镜像
    bool isSymmetrical(TreeNode* pRoot) {
        int LR[2005] = {};//存放从左到右遍历,得到的序列
        int RL[2005] = {};//存放从右到左遍历,得到的序列
        int it_lr = 0;//对应的数组下标
        int it_rl = 0;

        scan(pRoot, it_lr, LR, true);
        scan(pRoot, it_rl, RL, false);

        for(int i = 0; i < it_lr; i++){
            if(LR[i] != RL[i]){
                return false;
            }
        }
        return true;
    }
};

4.运行结果

成功通过!

在这里插入图片描述


结束语:

今天的分享就到这里啦,快来加入刷题大军叭!
👉点击开始刷题学习👈

在这里插入图片描述


感谢阅读

个人主页:清风莫追

CSDN话题挑战赛第2期
参赛话题:学习笔记

相关文章:

  • MATLAB算法实战应用案例精讲-【回归算法】XGBoost算法(附Java、Python和R语言代码)
  • 基于java春晓学堂管理系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署
  • 通关率不到0.1%的小游戏《羊了个羊》为什么这么火?
  • [架构之路-7]:架构师 - 嵌入式硬件架构师的工作内容和工作要求是什么
  • 【javaweb简单教程】3.使用JDBC操作数据库(含简单示例完整代码)
  • 【uiautomation】微信群发消息,获取群通讯录名单
  • 「数据结构详解·八」带权并查集 扩展域并查集
  • 【SQL刷题】DAY21----SQL组合查询专项练习
  • 解决使用Lambda分组后,每组多条数据处理
  • 商业地产如何走出高空置率困局?
  • <学习笔记>从零开始自学Python-之-基础语法篇(十一)正则表达式re库
  • 随想录一期 day2 [977.有序数组的平方|209. 长度最小的子数组|59.螺旋矩阵II(剥洋葱)]
  • 自动驾驶数据标注基本框架,你了解多少?丨曼孚科技
  • 前景理论-风险决策分析的思维模型
  • Intel汇编-CMOV条件传送指令
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 【刷算法】从上往下打印二叉树
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • golang 发送GET和POST示例
  • Invalidate和postInvalidate的区别
  • Java 网络编程(2):UDP 的使用
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • JS学习笔记——闭包
  • scala基础语法(二)
  • 老板让我十分钟上手nx-admin
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 软件开发学习的5大技巧,你知道吗?
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • MPAndroidChart 教程:Y轴 YAxis
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • $forceUpdate()函数
  • (20050108)又读《平凡的世界》
  • (BFS)hdoj2377-Bus Pass
  • (TOJ2804)Even? Odd?
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (学习日记)2024.01.19
  • (一)认识微服务
  • (转) 深度模型优化性能 调参
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET HttpWebRequest、WebClient、HttpClient
  • .Net MVC4 上传大文件,并保存表单
  • .NET 的程序集加载上下文
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .net专家(高海东的专栏)
  • ;号自动换行
  • @property括号内属性讲解
  • @Service注解让spring找到你的Service bean
  • []指针
  • [20150629]简单的加密连接.txt
  • [20160807][系统设计的三次迭代]
  • [51nod1610]路径计数
  • [Android Studio] 开发Java 程序
  • [Android实例] 保持屏幕长亮的两种方法 [转]