【C++】每日一题 199. 二叉树的右视图

给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

思路:
可以使用广度优先搜索(BFS)来遍历二叉树,但是在遍历过程中只记录每一层最右侧的节点值。这样最后记录的节点值就是从右侧看到的节点值

#include <vector>
#include <queue>
#include <iostream>

using namespace std;

// 二叉树节点结构
struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

class Solution {
public:
    vector<int> rightSideView(TreeNode* root) {
        vector<int> result;
        if (!root) return result;
        
        queue<TreeNode*> q;
        q.push(root);
        
        while (!q.empty()) {
            int size = q.size();
            TreeNode* rightmost = nullptr;
            for (int i = 0; i < size; ++i) {
                TreeNode* node = q.front();
                q.pop();
                // 更新当前层最右侧的节点
                rightmost = node;
                if (node->left) q.push(node->left);
                if (node->right) q.push(node->right);
            }
            // 将当前层最右侧的节点值加入结果集
            result.push_back(rightmost->val);
        }
        
        return result;
    }
};

int main() {
    // 创建二叉树
    TreeNode* root = new TreeNode(1);
    root->left = new TreeNode(2);
    root->right = new TreeNode(3);
    root->left->right = new TreeNode(5);
    root->right->right = new TreeNode(4);

    // 创建解决方案对象
    Solution solution;

    // 获取从右侧所能看到的节点值
    vector<int> result = solution.rightSideView(root);

    // 输出结果
    cout << "From right side view, the node values are: ";
    for (int val : result) {
        cout << val << " ";
    }
    cout << endl;

    // 释放内存
    delete root->left->right;
    delete root->right->right;
    delete root->left;
    delete root->right;
    delete root;

    return 0;
}

时间复杂度分析:

BFS遍历二叉树需要访问每个节点恰好一次,因此时间复杂度为 O(n),其中 n 是二叉树中的节点数。

空间复杂度分析:

在最坏情况下,队列中可能会存储二叉树中的所有叶子节点,即二叉树的最后一层。对于完全二叉树,最后一层的节点数量为 n/2,其中 n 是节点总数。因此,空间复杂度为 O(n)。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux网络】HTTPS【上】{运营商劫持/加密方式/数据摘要/https的诞生}

文章目录 1.引入1.1http与https1.2SSL/TLS1.3VPN1.4认识1.5密码学1.6为什么要加密&#xff1f;运营商 1.7常见的加密方式对称加密非对称加密 2.加密与解密3.数据摘要 && 数据指纹MD5 数字 签名理解三者数据摘要&#xff08;Digital Digest&#xff09;&#xff1a;数字…

数据结构与算法之树和二叉树的一些概念和性质

目录 前言 一、树的定义 二、树的若干术语 1.结点的度 2.叶子 3.双亲与孩子 4.兄弟 5.祖先 6.树的度 7.结点的层次 8.树的深度 9.有序树和无序树 10.森林 三、树的逻辑结构 四、树的存储结构 1.顺序存储 2.链式存储 五、二叉树 1.定义 2.二叉树的五种状态 …

美食推荐网站设计

**中文摘要&#xff1a;**在当今信息化、网络化的时代背景下&#xff0c;美食文化正逐渐融入人们的日常生活&#xff0c;而网络平台成为人们获取美食信息、分享美食体验的重要途径。为了满足广大美食爱好者对美食信息的探索和推荐需求&#xff0c;本文提出了一种创新的美食推荐…

OS复习笔记ch5-3

引言 上一节我们学习了关于信号量机制的一些内容&#xff0c;包括信号量的含义&#xff0c;对应的PV操作等。 如图所示&#xff0c;上一节主要是针对信号量的互斥&#xff0c;其实信号量机制还可以做很多事情&#xff0c;比如实现进程同步和前驱关系&#xff0c;这一节我们先复…

Selenium 自动化 —— 常用的定位器(Locator)

什么是定位器 定位器&#xff08;Locator&#xff09;是识别DOM中一个或多个特定元素的方法。 也可以叫选择器 Selenium 通过By类&#xff0c;提供了常见的定位器。具体语法如下&#xff1a; By.xxx("");我们选择单个元素时可以使用findByElement&#xff1a; Web…

ICode国际青少年编程竞赛- Python-2级训练场-坐标与列表练习

ICode国际青少年编程竞赛- Python-2级训练场-坐标与列表练习 1、 for i in range(6):Spaceship.step(Item[i].x - Spaceship.x)Dev.step(Item[i].y - Dev.y)Dev.step(Spaceship.y - Dev.y)2、 for i in range(5):Spaceship.step(Item[i].x - Spaceship.x)Flyer[i].step(Item[…

【MySQL数据库开发设计规范】之基础规范

欢迎点开这篇文章&#xff0c;自我介绍一下哈&#xff0c;本人笔名姑苏老陈&#xff0c;是一个JAVA开发老兵。 本文收录于 《MySQL数据库开发设计规范》专栏中&#xff0c;该专栏主要分享一些关于MySQL数据库开发设计相关的技术规范文章&#xff0c;定期更新&#xff0c;欢迎关…

《ESP8266通信指南》11-Lua开发环境配置

往期 《ESP8266通信指南》10-MQTT通信&#xff08;Arduino开发&#xff09;-CSDN博客 《ESP8266通信指南》9-TCP通信&#xff08;Arudino开发&#xff09;-CSDN博客 《ESP8266通信指南》8-连接WIFI&#xff08;Arduino开发&#xff09;&#xff08;非常简单&#xff09;-CSD…

机器学习(三) ----------线性回归算法(梯度下降+正则化)

目录 1 定义 2 损失函数&#xff08;回归&#xff09; 2.1 最小二乘函数&#xff08;Least Squares Function&#xff09; 2.2 均方误差&#xff08;Mean Squared Error, MSE&#xff09; 2.3 均方根误差&#xff08;Root Mean Squared Error, RMSE&#xff09; 2.4 平均绝…

自动驾驶纵向控制算法

本文来源——b站忠厚老实的老王&#xff0c;链接&#xff1a;忠厚老实的老王投稿视频-忠厚老实的老王视频分享-哔哩哔哩视频 (bilibili.com)&#xff0c;侵删。 功率和转速之间的关系就是&#xff1a;功率P等于转矩M乘以转速ω。并不是油门越大加速度就越大。 发动机和电机的转…

GDAL:Warning 1: All options related to creation ignored in update mode

01 警告说明 首先贴出相关代码&#xff1a; out_file_name Rs_{:4.0f}{:02.0f}.tiff.format(year, month) out_path os.path.join(out_dir, out_file_name) mem_driver gdal.GetDriverByName(MEM) mem_ds mem_driver.Create(, len(lon), len(lat), 1, gdal.GDT_Float32) …

掌握用户全生命周期数据,Xinstall让App投放更科学

在数字化时代&#xff0c;App已成为企业与用户互动的重要窗口。然而&#xff0c;想要让App在众多竞争者中脱颖而出&#xff0c;吸引并留住用户&#xff0c;有效的广告投放策略至关重要。这就需要对广告投放效果进行精准分析&#xff0c;以便及时调整策略&#xff0c;实现最大化…

Kubernetes的基本概念

目录 一.基本内容 1.定义 2.作用 二.特性 1.弹性伸缩 2.自我修复 3.服务发现和负载均衡 4.自动发布&#xff08;默认滚动发布模式&#xff09;和回滚 5.集中化配置管理和密钥管理 6.存储编排&#xff0c;支持外挂存储并对外挂存储资源进行编排 7.任务批处理运行 三…

clickhouse mergeTree表引擎解析

参照 https://clickhouse.com/docs/zh/engines/table-engines/mergetree-family/mergetree https://clickhouse.com/docs/en/optimize/skipping-indexes Clickhouse中最强大的表引擎当属MergeTree&#xff08;合并树&#xff09;引擎及该系列&#xff08;*MergeTree&#xff…

Springboot项目使用redis实现session共享

1.安装redis&#xff0c;并配置密码 这里就不针对于redis的安装约配置进行说明了&#xff0c;直接在项目中使用。 redis在windows环境下安装&#xff1a;Window下Redis的安装和部署详细图文教程&#xff08;Redis的安装和可视化工具的使用&#xff09;_redis安装-CSDN博客 2…

图片公式识别@文档公式识别@表格识别@在线和离线OCR工具

文章目录 abstract普通文字识别本地软件识别公式扩展插件下载小结 在线识别网站/API&#x1f47a;Quicker整合(推荐)可视化编辑和识别公式其他多模态大模型识别图片中的公式排版 开源模型 abstract 本文介绍免费图片文本识别(OCR)工具,包括普通文字识别,公式识别,甚至是手写公…

Linux网络——自定义序列化与反序列化

前言 之前我们学习过socket之tcp通信&#xff0c;知道了使用tcp建立连接的一系列操作&#xff0c;并通过write与read函数能让客户端与服务端进行通信&#xff0c;但是tcp是面向字节流的&#xff0c;有可能我们write时只写入了部分数据&#xff0c;此时另一端就来read了&#x…

ZYNQ MPSoC zcu102 PS端运行helloworld

文章目录 一、参考资料二、需要注意的步骤三、运行结果 一、参考资料 1.zcu102 zynq Mpsoc uart hello world——CSDN博客 2.zcu102自学 —— 第一个实验 &#xff08;纯PS 串口打印 Hello world&#xff09;——CSDN博客 3.【02】ALINX Zynq MPSoC XILINX FPGA视频教程 SDK 裸…

Linux:进程信号(一)信号的产生

目录 一、信号是什么&#xff1f; 二、Linux信号 三、信号处理方式 四、信号的产生 1、 通过终端按键产生信号 2、调用系统函数向进程发信号 3、 硬件异常产生信号 一、信号是什么&#xff1f; 在生活中&#xff0c;有许多信号&#xff0c;比如红绿灯&#xff0c;下课铃声…

如何使用Transformer-TTS语音合成模型

1、技术原理及架构图 ​ Transformer-TTS主要通过将Transformer模型与Tacotron2系统结合来实现文本到语音的转换。在这种结构中&#xff0c;原始的Transformer模型在输入阶段和输出阶段进行了适当的修改&#xff0c;以更好地处理语音数据。具体来说&#xff0c;Transformer-TT…
最新文章