代码随想录算法训练营第十五天|树的层序遍历 、226.翻转二叉树 、101.对称二叉树

news2024/9/21 0:37:31

层序遍历(广度优先遍历):

遍历思路:
借用队列来实现。
若根节点不为空,则先将根节点放入队列,
随后,在while循环中,判断队列当前的size,队列的size就是树在该层中的节点数量,所以有几个节点就要利用for循环分别将这几个节点的子节点再放入队列

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        queue<TreeNode*> MyQueue;
        vector<vector<int>> Res;
        vector<int> Temp;
        TreeNode* cur = root;

        if(root == nullptr)
          return Res;

        MyQueue.push(cur);
        
        while(!MyQueue.empty())
        {
            int size = MyQueue.size();
            for(int i=0;i<size;i++)
            {
                cur = MyQueue.front();
                Temp.push_back(cur->val);
                MyQueue.pop();
                
                if(cur->left) MyQueue.push(cur->left);
                if(cur->right) MyQueue.push(cur->right);
            }
            Res.push_back(Temp);
            Temp.clear();            
        }
        return Res;
    }
};

以下十题都可以安装这个思路进行编写:

  • 102.二叉树的层序遍历
  • 107.二叉树的层次遍历II
  • 199.二叉树的右视图
  • 637.二叉树的层平均值
  • 429.N叉树的层序遍历
  • 515.在每个树行中找最大值
  • 116.填充每个节点的下一个右侧节点指针
  • 117.填充每个节点的下一个右侧节点指针II
  • 104.二叉树的最大深度
  • 111.二叉树的最小深度

翻转二叉树 

题目链接:力扣

解题思路:这道题最关键的点在于 想清楚用那种遍历方式进行遍历
——前序和后序遍历较方便,用中序遍历会很绕,容易给自己踩坑

递归法

其实还是前序遍历的逻辑,先交换左右子树节点,然后交换左子树,再交换右子树

    TreeNode* invertTree1(TreeNode* root) {

        if(root == nullptr)
        return nullptr;

        TreeNode* Temp = root->left;
        root->left =root->right;
        root->right = Temp;

        invertTree(root->left);
        invertTree(root->right);
        return root;

    }

 迭代法

在前序遍历的基础上加以改动

 TreeNode* invertTree(TreeNode* root)
    {
        queue<TreeNode*> myqueue;
        TreeNode* cur = root;
        if(!cur) return nullptr;

        myqueue.push(cur);

        while(!myqueue.empty())
        {
            cur = myqueue.front();
            myqueue.pop();
            swap(cur->left, cur->right);

            if(cur->right) myqueue.push(cur->right);
            if(cur->left)  myqueue.push(cur->left);
        }

        return root;
    }

对称二叉树

递归法

题目链接:力扣 

解题思路:本质是比较根节点的左子树与右子树是不是相互翻转的,即我们要比较的是两个树(这两个树是根节点的左右子树),所以在递归遍历的过程中,也是要同时遍历两棵树。

 一个树的遍历顺序是左右中,一个树的遍历顺序是右左中。

class Solution {
public:
    bool isSymmetric(TreeNode* root) {

        if(!root)  return true;
        return compare(root->left,root->right);
    }

    bool compare(TreeNode* left, TreeNode* right)
    {
        if(left == nullptr && right != nullptr) return false;
        else if(left != nullptr && right == nullptr) return false;
        else if(left == nullptr && right == nullptr) return true;
        else if(left->val != right->val) return false;
        else return compare(left->left,right->right) && compare(left->right, right->left);
    }

};

迭代法 

逻辑和递归法是一样的,使用队列来比较两个树(根节点的左右子树)是否相互翻转

class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if (root == NULL) return true;
        queue<TreeNode*> que;
        que.push(root->left);   // 将左子树头结点加入队列
        que.push(root->right);  // 将右子树头结点加入队列
        
        while (!que.empty()) {  // 接下来就要判断这两个树是否相互翻转
            TreeNode* leftNode = que.front(); que.pop();
            TreeNode* rightNode = que.front(); que.pop();
            if (!leftNode && !rightNode) {  // 左节点为空、右节点为空,此时说明是对称的
                continue;
            }

            // 左右一个节点不为空,或者都不为空但数值不相同,返回false
            if ((!leftNode || !rightNode || (leftNode->val != rightNode->val))) {
                return false;
            }
            que.push(leftNode->left);   // 加入左节点左孩子
            que.push(rightNode->right); // 加入右节点右孩子
            que.push(leftNode->right);  // 加入左节点右孩子
            que.push(rightNode->left);  // 加入右节点左孩子
        }
        return true;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/564973.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ubuntu换镜像源(ubuntu换源)

ubuntu换镜像源&#xff08;ubuntu换源&#xff09; 文章目录 ubuntu换镜像源&#xff08;ubuntu换源&#xff09;1. 备份镜像源文件2. 根据不同 ubuntu 版本设置不同的镜像源2.1 focal 版本镜像源2.2 bionic 版本镜像源2.3 ubuntu 自带源&#xff1a; 参考文献 1. 备份镜像源文…

数据库连接 ---MySQL的总结(八)

数据库连接 —MySQL的总结&#xff08;八&#xff09; mysql使用在c编程之中使用&#xff0c;需要调用官方c库进行使用。 库的安装 库文件&#xff0c;安装mysql的c链接库 yum install mysql-server接口介绍 初始化 MYSQL *mysql mysql_init(nullptr);连接 mysql_real_conn…

“智汇新算力,众启Z力量”惠普发布全新一代Z系列工作站,共赢算力黄金时代

5月23日&#xff0c; “智汇新算力&#xff0c;众启Z力量”惠普Z系列新品发布会在上海盛大举行。本次发布会上&#xff0c;惠普Z 系列工作站焕新升级&#xff0c;以高算力、强稳定、强拓展的产品及解决方案&#xff0c;帮助各行业用户专注自身领域、驾驭复杂工作&#xff0c;从…

HNU-电路与电子学-小班2

第二次讨论 讨论题目&#xff1a; 1、电子秤的电桥电路可以分别用 1 个压控电阻、 2 个压控电阻、 3 个压控电阻、 4 个压控电阻实现吗&#xff1f;试写出每种实现的 U AB 输出表达式&#xff0c;并分析哪种实现电桥 电压的灵敏度&#xff08;SV/ △ R &#xff09;高。 …

【Python Tableau】零基础也能轻松掌握的学习路线与参考资料

一、学习路线 Python和Tableau都是当前市场上非常热门的数据分析和可视化工具。下面是Python Tableau的学习路线&#xff1a; 学习Python基础知识&#xff1a;Python是一门非常易学易用的编程语言&#xff0c;可以选择相应书籍进行学习&#xff0c;如《笨办法学Python》、《Py…

Node.js中Buffer的一些实现原理

1.前言 在ES6之前&#xff0c;JavaScript无法直接处理二进制数据&#xff0c;Node.js为了弥补这个不足引入了 Buffer&#xff0c;其是Node.js的核心模块之一&#xff0c;底层实现基于C。本文将从 Node.js v14.20.0 的源码分析 Buffer 的一些实现原理。 2.ArrayBuffer 在介绍…

Visual Studio插件DevExpress CodeRush v22.1- 支持C# 10

DevExpress CodeRush是一个强大的Visual Studio .NET 插件&#xff0c;它利用整合技术&#xff0c;通过促进开发者和团队效率来提升开发者体验。为Visual Studio IDE增压、消除重复的代码并提高代码质量&#xff0c;可以快速思考、自动化测试、可视化调试和重构。 CodeRush v2…

资深程序员深度体验ChatGPT一周发现竟然....

周一打卡上班&#xff0c;老板凑到我跟前&#xff1a;“小李啊&#xff0c;这周有个新需求交给你做一下&#xff0c;给我们的API管理平台新增一个智能Mock的功能...”。我条件反射般的差点脱口而出&#xff1a;“这个需求做不了..”。不过在千钧一发之间&#xff0c;我想起了最…

【文章学习系列之技巧】Network Slimming

本章内容 文章概况问题来源方法实验结果总结 文章概况 这是一篇2017年发表于ICCV的一篇论文。该论文指出深度卷积神经网络的应用受到了高计算成本的阻碍&#xff0c;并提出一种修剪模型结构的方式用于降低这种成本&#xff0c;使得模型大小减小、运行内存减小且不降低精度的情…

http\https协议

前言 小亭子正在努力的学习编程&#xff0c;接下来将开启javaEE的学习~~ 分享的文章都是学习的笔记和感悟&#xff0c;如有不妥之处希望大佬们批评指正~~ 同时如果本文对你有帮助的话&#xff0c;烦请点赞关注支持一波, 感激不尽~~ 目录 前言 一、 认识http协议 1.概念 1.1…

ChatGPT APP Plus升级全记录:购买礼品卡、兑换和处理失败

大家好&#xff0c;我是可夫小子&#xff0c;《小白玩转ChatGPT》专栏作者&#xff0c;关注AIGC、读书和自媒体。 在上一篇《ChatGPT APP来了&#xff0c;支持语音输入&#xff0c;还可以直接订阅Plus账号》文章中&#xff0c;我介绍了ChatGPT App下载安装教程。本文主要介绍怎…

YOLO中的值得借鉴的思想

关键理论的理解&#xff0c;后面会补充结构等。 1.YOLO1中将图像划分为7*7个网格&#xff0c;每个网格都预测网格中的的类别&#xff08;是什么物体&#xff09;&#xff0c;以及预测到的物体所对应的框&#xff08;四个位置量&#xff0c;一个置信度&#xff09;&#xff0c;所…

一、尚医通预约下单

文章目录 一、预约下单1、需求分析1.1订单表结构1.2下单分析 2、搭建service-order模块2.1 搭建service-order模块2.2 修改配置2.3 启动类2.4配置网关 3、添加订单基础类3.1 添加model3.2 添加Mapper3.3 添加service接口及实现类3.4 添加controller 4、封装Feign调用获取就诊人…

【Redis】聊一下Redis事务以及watch机制

我们知道熟悉MySQL的同学&#xff0c;一定了解ACID属性。ACID分别对应四种属性&#xff0c;但是Redis的事务和ACID属性有什么不一样的地方嘛&#xff0c;我们来深入探讨下。 Redis事务和MySQL事务的区别 ACID的本质是保证了事务执行前后对结果的保证&#xff0c;以及数据状态…

二、数据结构2:双链表 模板题+算法模板(双链表)

文章目录 算法模板双链表题目模板 模板题双链表原题链接题目思路题解 算法模板 双链表题目模板 // e[]表示节点的值&#xff0c;l[]表示节点的左指针&#xff0c;r[]表示节点的右指针&#xff0c;idx表示当前用到了哪个节点 int e[N], l[N], r[N], idx;// 初始化 void init()…

Android进阶 View事件体系(一):概要介绍和实现View的滑动

Android进阶 View事件体系&#xff08;一&#xff09;&#xff1a;概要介绍和实现View的滑动 内容概要 本篇文章为总结View事件体系的第一篇文章&#xff0c;将介绍的内容主要有&#xff1a; 什么是View和ViewGroupAndroid中View的坐标轴手势检测和速度检测如何实现View的滑动…

【ZYNQ】ZYNQ7000 UART 控制器及驱动应用示例

UART 简介 我们在使用 PS 的时候&#xff0c;通常会添加 UART 控制器&#xff0c;用于打印信息和调试代码。除此之外&#xff0c;PS 在和外 部设备通信时&#xff0c;也会经常使用串口进行通信。 UART 控制器 UART 控制器是一个全双工异步收发控制器&#xff0c;ZYNQ 内部包…

ssm实现发送邮箱功能

参考&#xff1a;ssm整合JavaMail发送邮件_ssm整合mimemessage_ds_surk的博客-CSDN博客 我在这位前辈写的博客的基础上进行讲解完善&#xff0c;避免踩坑。 我的jdk版本&#xff1a;1.8.0_333 1、引入依赖 相信很多朋友都卡在这里&#xff1a; 1、没有JavaMailSenderImpl类 2、…

数字逻辑 期末

概述 教材&#xff1a;《电子技术基础&#xff08;数字部分&#xff09;》 第五版 7400系列是TTL型芯片&#xff0c;商用型 数制 十进制->二进制 除2取余法&乘2取整法&#xff08;注意精度&#xff0c;但计科简单不考&#xff09; 十六进制->二进制 一位变四位 八…

Linux下串口编程

Linux下串口编程 Linux下的串口编程是通过串口设备文件和串口通信的系统调用函数来实现的。Linux下的串口设备文件通常为/dev/ttyS或/dev/ttyUSB(*表示数字),这些设备文件代表了对应的串口硬件设备。 在进行串口编程之前,需要先打开并初始化串口设备,其中包括设置波特率…