学习记录:js算法(五十):二叉树的右视图

news2024/10/1 22:03:25

文章目录

    • 二叉树的右视图
      • 我的思路
      • 网上思路
    • 总结

二叉树的右视图

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

图一:
在这里插入图片描述

示例 1:如图一
输入: [1,2,3,null,5,null,4]
输出: [1,3,4]

示例 2:
输入: [1,null,3]
输出: [1,3]

示例 3:
输入: []
输出: []

我的思路
循环
网上思路
递归

我的思路

var rightSideView = function(root) {
    if (root === null) return [];
    
    let queue = [root];
    let result = [];
    
    while (queue.length > 0) {
        let size = queue.length;
        for (let i = 0; i < size; i++) {
            let currentNode = queue.shift();
            
            // 将左右子节点加入队列
            if (currentNode.left) queue.push(currentNode.left);
            if (currentNode.right) queue.push(currentNode.right);
            
            // 如果是当前层的最后一个节点,将其值加入结果数组
            if (i === size - 1) {
                result.push(currentNode.val);
            }
        }
    }
    
    return result;
};

讲解
要在二叉树中获取从右视图看到的节点值,我们可以使用层次遍历(广度优先搜索 BFS)的方法,同时跟踪每一层的最后一个节点。这样,我们就可以收集到每一层最右边的节点值。

  1. 初始化:创建一个队列 queue 并将根节点 root 加入队列。同时创建一个空数组 result 用于存放结果。
  2. 层次遍历:进行层次遍历,使用一个循环,只要队列不为空就一直运行。在每次循环开始时,记录当前队列的大小 size,这代表了当前层的节点数。
  3. 处理当前层节点:在当前层中,依次从队列中取出节点,将其左右子节点加入队列。同时,记录下当前层的最后一个节点的值,即为当前层的右视图节点。
  4. 更新结果:将当前层的右视图节点值添加到结果数组 result 中。
  5. 重复步骤3和4,直到队列为空,即所有节点都被处理完毕。
  6. 返回结果:返回结果数组 result,它包含了从右视图看到的节点值。

网上思路

var rightSideView = function (root) {
    const result = []; // 存储结果

    function dfs(node, level) {
        if (!node) return; // 如果节点为空,返回

        // 如果当前层级的结果数组没有值,说明是第一次访问这一层
        if (result.length === level) {
            result.push(node.val); // 记录当前节点的值
        }

        // 先遍历右子树,再遍历左子树
        dfs(node.right, level + 1);
        dfs(node.left, level + 1);
    }

    dfs(root, 0); // 从根节点开始DFS
    return result; // 返回从右侧看到的节点值
}

讲解

  1. rightSideView 函数:定义一个结果数组 result,并调用递归函数 dfs
  2. 递归函数 dfs
    • 检查当前节点是否为空,如果为空则返回。
    • 如果当前层级的结果数组还没有值,说明这是第一次访问这一层,将当前节点的值加入结果。
    • 先递归访问右子树,再访问左子树,以保证优先访问右侧节点。

总结

忘记递归的写法了

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

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

相关文章

uni-app #ifdef #ifndef #endif的使用和区别

1. uni-app #ifdef #ifndef #endif的使用和区别 条件编译是一种在编程中根据特定平台选择性编译代码的技术。如#ifdef和#endif根据APP-PLUS平台标识在微信小程序、支付宝小程序、百度小程序、头条小程序、QQ小程序以及H5应用中实现代码的平台特定执行。下面介绍了如何使用#ifde…

基于Java+SpringBoot3+vue3+uniapp点餐/外卖管理系统设计与实现(视频讲解)

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

微服务sentinel解析部署使用全流程

sentinel源码地址&#xff1a; 介绍 alibaba/Sentinel Wiki GitHub sentinel官方文档&#xff1a; https://sentinelguard.io/zh-cn/docs/introduction.html Sprong Cloud alibaba Sentinel文档【小例子】 : Sentinel alibaba/spring-cloud-alibaba Wiki GitHub 目录 1、…

wsl(1) --- win11环境配置

1. 开启WSL可选功能 打开设置&#xff0c;点击应用&#xff0c;点击可选功能&#xff0c;点击更多Windows功能&#xff0c;查看是否开启了【适用于Linux的Windows子系统】和【虚拟机平台】 2. 更新wsl 不执行这步&#xff0c;启动wsl镜像时会出现WslRegisterDistribution f…

带徒实训项目实战讲义分享:ApiFirst文档对比功能页面开发2

前一篇&#xff1a;带徒实训项目实战讲义分享&#xff1a;ApiFirst文档对比功能页面开发 亲爱的学员朋友们好&#xff0c;本小节跟小卷一起来学习用thymeleaf模板技术来渲染数据模型到表格中&#xff0c;通过本小节的学习&#xff0c;你会真正将thymeleaf模板技术应用到实处&a…

JavaScript 全攻略:从基础到精通

一、JavaScript 初印象 &#xff08;一&#xff09;起源与发展 JavaScript 的诞生源于对网页动态性的需求。1995 年&#xff0c;布兰登・艾奇仅用十天时间就设计出了这门语言&#xff0c;最初命名为 Mocha&#xff0c;后改为 LiveScript&#xff0c;最终定名为 JavaScript。它…

OLED显示屏中常见的3-spi和4-spi

显示屏中经常出现的IIC&#xff0c;3-spi和4-spi 其中&#xff0c;在用spi接口中经常用到的是4-spi&#xff0c;和IIC相比&#xff0c;spi有更高的传输速度。而IIC需要更少的引脚。下面是以SH1107驱动手册里的内容简单了解3-spi和4-spi区别 从两张图中可以看出&#xff0c;3…

Vue2(十三):路由

一、路由的简介 vue-rooter&#xff1a;是vue的一个插件库&#xff0c;专门用来实现SPA应用 1.对SPA应用的理解 1、单页 Web 应用&#xff08;single page web application&#xff0c;SPA&#xff09;。 2、整个应用只有一个完整的页面 index.html。 3、点击页面中的导航链…

Hutool工具包

下载jar包网址 hutool-all-5.3.2.jar下载及Maven、Gradle引入代码&#xff0c;pom文件及包内class -时代Java (nowjava.com) maven导入 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.3.2&l…

PHP后台+基于微信小程序外卖点餐系统毕业设计源代码作品和开题报告

博主介绍&#xff1a;黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者&#xff0c;CSDN博客专家&#xff0c;在线教育专家&#xff0c;CSDN钻石讲师&#xff1b;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程&#xff…

Ansible学习之ansible-pull命令

想要知道ansible-pull是用来做什么的&#xff0c;就需要了解Ansible的工作模&#xff0c;Ansible的工作模式有两种&#xff1a; push模式 push推送&#xff0c;这是Ansible的默认模式&#xff0c;在主控机上编排好playbook文件&#xff0c;push到远程主机上来执行。pull模式 p…

一文搞懂CP-ABE,基于访问控制树的BSW方案原理分析与源码实现【基于C++、PBC库】

文章目录 一. 概述1.1 CP-ABE基础介绍1.2 访问控制树与BSW方案原理1.2.1 系统模型与角色1.2.2 主要算法1.2.3 访问结构与访问树1.2.4 数学基础 二. 具体算法流程2.1 Setup&#xff08;初始化&#xff09;2.2 KeyGen&#xff08;密钥生成&#xff09;2.3 Encrypt&#xff08;加密…

Typora---进度条(1)

本系列专门介绍关于typora中用到的小玩意。&#xff08;哈哈哈哈哈哈&#xff09; 本帖子讲述关于 进度条 的事情。 在typora中通过下面的语句可以显示出一个进度条&#xff1a; ![95% done](https://markdone.org/progress//95.png)通过更改上面语句中的数字可以展示不同的进…

local minima 的问题如何解决

&#x1f680; 在初始神经网络那一节&#xff08;链接如下&#xff1a;初识机器学习&#xff09;是遇到了两个问题&#xff0c;第一个是在求解函数未知参数数时会遇到local minima的问题&#xff0c;在哪里我们并没有过多解释&#xff0c;就是说一般遇不到并且很好解决&#xf…

合并两个有序数组(c语言)

1.//给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 //注意&#xff1a;最终&#xff0c;合并后数…

Unity 2D RPG Kit 学习笔记

学习资料&#xff1a; B站教学视频&#xff1a;https://www.bilibili.com/video/BV1dC4y1o7A5?p1&vd_source707ec8983cc32e6e065d5496a7f79ee6 2D RPG Kit Documentation.pdf文档 1、2D RPG Kit Documentation文档 1.1、Scenes/TitleScreen 开始菜单工程 1.2、https://it…

32、Qt读写csv文件

一、写入 QString fileName QFileDialog::getSaveFileName(this, "写入", "/untitled.csv", tr("Files (*.csv)"));if(fileName.isEmpty()){QMessageBox::warning(this, "提示", "文件名不能为空", QMessageBox::Ok);retur…

探索分布式IO模块的介质冗余:赋能工业自动化的稳健之心

在日新月异的工业自动化领域&#xff0c;每一个细微环节的稳定性都直接关系到生产线的效率与安全。随着智能制造的深入发展&#xff0c;分布式IO&#xff08;Input/Output&#xff09;模块作为连接现场设备与控制系统的关键桥梁&#xff0c;其重要性日益凸显。我们自主研发的带…

网络原理-传输层UDP

上集回顾&#xff1a; 上一篇博客中讲述了应用层如何自定义协议&#xff1a;确定传输信息&#xff0c;确定数据格式 应用层也有一些现成的协议&#xff1a;HTTP协议 这一篇博客中来讲述传输层协议 传输层 socket api都是传输层协议提供的&#xff08;操作系统内核实现的了…

MBTI人格测试项目(uni-app微信小程序 + SpringBoot)

目录 项目概述 测试 & 计分方式说明 页面展示 开发日志文档 素材&#xff1a;题库和人格分析 Gitee源码地址 项目概述 1.通过回答70道不同类型的题目&#xff0c;推算出MBTI人格类型&#xff0c;并给出此人格类型的解析。 2.使用uni-app编写微信小程序。 3.前端使…