Day15——层序遍历、反转二叉树、对称二叉树

简介: Day15——层序遍历、反转二叉树、对称二叉树

前言


今日文案:

坚持,任何的限制,都是从自己的内心开始的、只有一条路不能选择――那就是放弃的路;只有一条路不能拒绝――那就是成长的路。

一、层序遍历


关键词,广度搜索,一层一层遍历,一下是模板,修改之后,爆肝十题。

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        queue<TreeNode*> que;                        //建立队列
        if (root != NULL) que.push(root);        //插入根
        vector<vector<int>> result;                //结果集
        while (!que.empty()) {
            int size = que.size();                //一定要自定义,因为队列是一直变化的
            vector<int> vec;
            for (int i = 0; i < size; i++) {
                TreeNode* node = que.front();    //一层一层遍历
                que.pop();                        //弹出第一个操作
                vec.push_back(node->val);                //按照中左右,前序遍历
                if (node->left) que.push(node->left);
                if (node->right) que.push(node->right);
            }
            result.push_back(vec);                //出来一次就是一层的答案
        }
        return result;
    }
};

二、层序遍历||


题目要求:

给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

力扣

相对于模板只是反转了一下

class Solution {
public:
    vector<vector<int>> levelOrderBottom(TreeNode* root) {
        vector<vector<int>> ans;
        queue<TreeNode*> que;
        if(root!=0)
        {
            que.push(root);
        }
        while(!que.empty())
        {
            int size=que.size();
            vector<int>temp;
            for(int i=0;i<size;i++){
                TreeNode*node=que.front();
                que.pop();
                temp.push_back(node->val);
                if(node->left)
                que.push(node->left);
                if(node->right)
                que.push(node->right);
            }
            ans.push_back(temp);
        }
        reverse(ans.begin(),ans.end());        //关键点
        return ans;
    }
};

三、二叉树的右视图


力扣

相对于模板,我们就是输出结果集最右边的那个元素就行。

class Solution {
public:
    vector<int> rightSideView(TreeNode* root) {
        vector<int> ans;
        int count=0;
        queue<TreeNode*> que;
        if(root!=0)
        {
            que.push(root);
        }
        while(!que.empty())
        {
            vector<int> temp;
            int size=que.size();
            for(int i=0;i<size;i++)
            {
                TreeNode*node=que.front();
                que.pop();
                temp.push_back(node->val);
                if(node->left)
                que.push(node->left);
                if(node->right)
                que.push(node->right);
            }
            int a=temp.size();
            ans.push_back(temp[a-1]);        //重点
        }
        return ans;
    }
};

四、二叉树的层平均值


题目来源:

力扣

重点:就是每一层求出之后,然后就计算平均值保存。

class Solution {
public:
    vector<double> averageOfLevels(TreeNode* root) {
        vector<double> ans;
        queue<TreeNode*> que;
        if(root!=0)
        {
            que.push(root);
        }
        while(!que.empty())
        {
            int size=que.size();
            vector<double> temp;
            for(int i=0;i<size;i++)
            {
                TreeNode*node=que.front();
                que.pop();
                temp.push_back(node->val);
                if(node->left)
                que.push(node->left);
                if(node->right)
                que.push(node->right);
            }
            double sum=0;
            for(int i=0;i<temp.size();i++)
            {
                sum+=temp[i];
            }
            double r=sum/temp.size();
            ans.push_back(r);
        }
        return ans;
    }
};

五、N叉树的层序遍历


题目来源:

力扣

重点:层序遍历二叉树是分别传入父亲的所有的子孩子,只不过二叉树是传入左右孩子,二N叉树不只是左右孩子,但只要把全部孩子传进去就行。

class Solution {
public:
    int maxDepth(Node* root) {
        if(root==0)
        return 0;
        int res=0;
        for(auto &x:root->children)
        {
            int D=maxDepth(x);            //寻找深度
            res=max(D,res);            //最大值就是最大深度
        }
            return res+1;            //返回上一层+1
    }
};

接下来就不一一水了,就是明白一层一层遍历的规律,修改一下找到我们需要的部分就行。

六、翻转二叉树


题目描述

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

题目来源:

力扣

思路分析:

我们只需要交换根节点对于左右孩子的指针就行,有点像中序遍历,先改变中节点的值,再向左,交换再下一步,注意一定要是中序遍历,因为这样才能保证每个节点都被交换了。

class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        if(root==0)
        return root;
        swap(root->left,root->right);
        invertTree(root->left);
        invertTree(root->right);
        return root;
    }
};

七、对称二叉树


题目来源:

力扣

思路:

主要是要从外层 里层遍历,然后从值和结构方面判断是否对称。

class Solution {
public:
    bool compare(TreeNode*left,TreeNode*right)
    {
        if(left==0&&right!=0)            //判断结构是否对称
        {
            return false;
        }
        if(left!=0&&right==0)
        {
            return false;
        }
        if(left==0&&right==0)            //结构对称了就返回真
        return true;
        if(left->val!=right->val)        //判断值是否相等,一定要在后面否则会操控空指针
        {
            return false;
        }
        bool outside=compare(left->left,right->right);        //里外层遍历
        bool inside=compare(left->right,right->left);
        return outside&&inside;
    }
    bool isSymmetric(TreeNode* root) {
        if(root==0)
        {
            return true;
        }
        return compare(root->left,root->right);
    }
};

总结


层序遍历模板要熟,用deque模板,反转二叉树是中序控制翻转,对称二叉树则要明白遍历对称顺序,一定要明白里外一起遍历,从结构和值来判断。

相关文章
|
测试技术
软件测试的艺术:探索式测试的实践与思考
在软件开发的广阔海洋中,测试是确保航船稳健行驶的关键。本文将带你领略探索式测试的魅力,一种结合创造性思维和严格方法论的测试方式。我们将一起揭开探索式测试的神秘面纱,了解其核心概念、实施步骤和带来的效益。通过实际代码示例,你将学会如何将探索式测试融入日常的软件质量保证流程中,提升测试效率与质量。
|
消息中间件 Java
SpringBoot RabbitMQ死信队列
SpringBoot RabbitMQ死信队列
317 0
|
4月前
|
人工智能 供应链 数据可视化
工作流梳理工具实战教程:手把手教你绘制第一张自动化流程图
本文剖析了团队因流程混乱导致重复劳动和效率低下的问题,提出通过工作流梳理提升协作效率的解决方案。总结了流程梳理的六大核心需求,并深度测评了6款主流工具,国内有板栗看板那,国外有kiss flow结合团队规模与需求提供选型建议,助力企业高效落地流程优化。
|
7月前
|
人工智能 安全 Go
Go语言中 Mutex 的实现原理
本文深入解析了 Go 中 `sync.Mutex` 的实现原理及其工作机制。`Mutex`(互斥锁)是并发编程中的基础同步机制,用于保护共享资源不被多个 Goroutine 同时访问。Go 的 `sync.Mutex` 通过轻量级的结构体实现,包含 `state` 和 `sema` 两个字段,分别用于表示锁状态和管理 Goroutine 的阻塞与唤醒。 文章详细分析了锁的获取(`Lock()`)和释放(`Unlock()`)过程,包括快速路径和慢速路径的实现逻辑。在慢速路径中,介绍了自旋锁优化、饥饿模式以及信号量机制的应用,确保高效且公平地管理锁竞争。
199 6
|
Prometheus 监控 Kubernetes
Prometheus 在微服务架构中的应用
【8月更文第29天】随着微服务架构的普及,监控和跟踪各个服务的状态变得尤为重要。Prometheus 是一个开源的监控系统和时间序列数据库,非常适合用于微服务架构中的监控。本文将详细介绍 Prometheus 如何支持微服务架构下的监控需求,包括服务发现、服务间的监控指标收集以及如何配置 Prometheus 来适应这些需求。
523 1
|
10月前
|
机器学习/深度学习 人工智能 API
aliyun评测零门槛、即刻拥有 DeepSeek-R1 满血版
DeepSeek-R1满血版是一款零门槛、高性能的深度学习工具,旨在帮助开发者和研究人员高效实现创新。评测显示,其操作界面设计友好,左右分屏布局使理论与实践紧密结合,极大提升了操作连贯性和效率。用户可轻松获取API-KEY,并通过Chatbox配置进行深度学习对话,整个过程简单流畅。该工具在部署集成性、易用性及高性能计算支持方面表现出色,尤其适合本地软件部署,满足用户的实际需求。阿里云提供的详尽文档和引导也使得初次使用者能快速上手,体验极佳。
297 1
|
9月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于GA遗传优化TCN-LSTM时间卷积神经网络时间序列预测算法matlab仿真
本项目基于MATLAB 2022a实现了一种结合遗传算法(GA)优化的时间卷积神经网络(TCN)时间序列预测算法。通过GA全局搜索能力优化TCN超参数(如卷积核大小、层数等),显著提升模型性能,优于传统GA遗传优化TCN方法。项目提供完整代码(含详细中文注释)及操作视频,运行后无水印效果预览。 核心内容包括:1) 时间序列预测理论概述;2) TCN结构(因果卷积层与残差连接);3) GA优化流程(染色体编码、适应度评估等)。最终模型在金融、气象等领域具备广泛应用价值,可实现更精准可靠的预测结果。
|
12月前
|
机器学习/深度学习 存储 人工智能
智能体首次达到Kaggle Grandmaster水平,华为用结构化推理补齐思维链短板
近日,华为诺亚方舟实验室与伦敦大学学院(UCL)联合开发的智能体Agent K v1.0在Kaggle竞赛中达到Grandmaster水平,引发广泛关注。该智能体采用创新的结构化推理框架,优化长期和短期记忆,动态处理复杂推理任务。通过自动化协议,Agent K v1.0能自动完成数据收集、清理、预处理等任务,并在多种数据模态下取得优异成绩。其Elo-MMR评分位于前38%,获得多枚奖牌,展示了强大的预测和决策能力。这一突破为AI在数据科学领域的应用开辟了新可能,但也需关注其局限性和伦理影响。论文地址:https://arxiv.org/pdf/2411.03562。
340 22
|
搜索推荐 Java Go
深入了解归并排序算法
深入了解归并排序算法
280 0
|
存储 数据管理 Linux
Linux 存储管理 (一)存储方式
【8月更文挑战第13天】在Linux中,存储管理方式多样,包括文件系统如Ext4、XFS,支持高效数据管理;磁盘分区实现数据隔离;逻辑卷管理(LVM)提供灵活的存储池;网络文件系统(NFS)及网络附加存储(NAS)实现远程文件共享;存储区域网络(SAN)提供高性能块级访问;RAID技术增强数据冗余与读写速度。分区类型含主分区、扩展分区、逻辑分区及引导分区,利用`lsblk`可查看磁盘信息,而`fdisk`则用于创建与管理分区。这些技术可根据需求灵活组合,优化存储效率与安全性。
462 0