算法通关村第六关——原来如此简单

news/2024/11/16 21:01:50/

层次遍历:又叫广度优先遍历。就是从根节点开始,先访问根节点下面一层全部元素,再访问之后的层次,直到访问完二叉树的最后一层。

我们先看一下基础的层次遍历题,力扣102题:给你一个二叉树,请你返回其按层序遍历得到的节点值。(即逐层地,从左到右访问所有节点)。

分析:先将根节点root放到队列queue中,接着遍历队列。遍历当前层次的节点时,如果这个节点还有子节点,就将其加入队列中;如果当前层次遍历完了,就将队列的长度重新指向新的队列长度sizeOfQueue,这时队列长度就是下一层的节点个数。

在这里插入图片描述

  function TreeNode(val, left, right) {this.val = (val === undefined ? 0 : val)this.left = (left === undefined ? null : left)this.right = (right === undefined ? null : right)}/*** 层次遍历,自顶向下  *@param: {TreeNode} root;*@return {number[][]}* * */function levelOrder(root) {if (!root) {return [];}let result = [];let queue = [];queue.push(root);while (queue.length > 0) {let size = queue.length;const tempList = [];for (let i = 0; i < size; i++) {let t = queue.shift();tempList.push(t.val);if (t.left !== null) {queue.push(t.left);}if (t.right !== null) {queue.push(t.right);}}result.push(tempList);}return result;}

在上一题的基础上,我们看一下力扣515题,给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。

分析:这其实就是先进行层次遍历,之后找出每一层的最大值即可。我们用一个变量maxValue来记录当前得到的最大值。和本层的每一个节点的值进行比较。

/*** @param {TreeNode} root* @return {number[]}* */
function largestValues(root) {if (!root) {return [];}const largestValues = []; // 存放每一层的最大值let queue = [root];while (queue.length > 0) {let sizeOfQueue = queue.length;let largestValue = -Number.MAX_VALUE;while (sizeOfQueue > 0) {sizeOfQueue--;const treeNode = queue.shift();largestValue = Math.max(largestValue, treeNode.val)	// 比较大小if (treeNode.left !== null) {queue.push(treeNode.left);}if (treeNode.right !== null) {queue.push(treeNode.right);}}largestValues.push(largestValue); // 把每一层最大值加入存放最大值的数组}return largestValues;
}

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

**分析:**这道题也是层次遍历的变种题,我们思考一下,既然需要我们找到每一层最右边节点的值,那在我们遍历每一层节点的时候,我们已经将这层节点放入队列,是不是只需要判定一下for循环的索引值是否等于队列长度 - 1即可,这样我们找到了最右边的节点,同样的如果for循环的索引值= 0 ,那么找到的就是这层最左边的节点。

function rightSideView(root) {const result = [];let queue = [root];if (!root) {return [];}while (queue.length > 0) {const sizeOfQueue = queue.length;for (let indexOfQueue = 0; indexOfQueue < sizeOfQueue; indexOfQueue++) {const treeNode = queue.shift();if (treeNode.left) {queue.push(treeNode.left);}if (treeNode.right) {queue.push(treeNode.right);}// 如果是队列的最后一个节点就是每一层最右边的节点if (indexOfQueue === sizeOfQueue - 1) {result.push(treeNode.val);}}}return result;
}

总结

掌握了层序遍历的方法,就可以对很多二叉树的变种题做出应对。


http://www.ppmy.cn/news/1030585.html

相关文章

BeanFactory和FactoryBean

推荐阅读 AI文本 OCR识别最佳实践 AI Gamma一键生成PPT工具直达链接 玩转cloud Studio 在线编码神器 玩转 GPU AI绘画、AI讲话、翻译,GPU点亮AI想象空间 「java、python面试题」来自UC网盘app分享&#xff0c;打开手机app&#xff0c;额外获得1T空间 https://drive.uc.cn/…

Process.Start 报错

Process.Start 报错 System.Diagnostics.Process.StartWithShellExecuteEx Process.Start 为什么会引发“系统找不到指定的文件”异常 Process.Start 报错 找不到路径 ,System.ComponentModel.Win32Exception:“系统找不到指定的文件。 问题1、 在WinForm中可能是权限问题&…

【灵商课堂】知识的结束就是智慧的开始

心无挂碍&#xff0c;心无恐惧 1、知识不会通向智慧。 我们累积了关于很多事情的大量知识&#xff0c;但是要按照学到的知识去明智地行动&#xff0c;看起来几乎是不可能的。学校、学院和大学传授有关行为、宇宙、科学和各种技术的知识&#xff0c;但是这些教育中心很少帮助一个…

[Leetcode] [Tutorial] 多维动态规划(未完待续)

文章目录 62. 不同路径Solution 62. 不同路径 一个机器人位于一个 m ∗ * ∗ n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角。 问总共有多少条不同的路径&#xff1f; 示例…

文盘Rust -- Mutex解决并发写文件乱序问题 | 京东云技术团队

在实际开发过程中&#xff0c;我们可能会遇到并发写文件的场景&#xff0c;如果处理不当很可能出现文件内容乱序问题。下面我们通过一个示例程序描述这一过程并给出解决该问题的方法。 use std::{fs::{self, File, OpenOptions},io::{Write},sync::Arc,time::{SystemTime, UNI…

【mysql并行批量删除死锁排查】

文章目录 背景表单和索引结构原因分析解决方案 背景 mysql批量删除并插入新数据的场景下&#xff0c;为提高执行效率&#xff0c;使用了多线程并发执行的方式。当然mysql建表时使用了分区&#xff08;partition&#xff09;机制&#xff0c;聚焦到我们这次讨论的问题&#xff…

Nature子刊 |肠道宏病毒组揭示百岁老人长寿秘诀

发表期刊&#xff1a;nature microbiology 发表时间&#xff1a;2023 影响因子&#xff1a;28.3 DOI: 10.1038/s41564-023-01370-6 研究背景 衰老是一种不可逆转的自然过程&#xff0c;随着年龄的增长&#xff0c;机体诸多方面出现功能性下降&#xff0c;与衰老相关的疾病&a…

【栈】394. 字符串解码

394. 字符串解码 解题思路 构造辅助栈stack 遍历字符串s的每一个字符c当c为数字的时候 将数字转化为数字multi当c是字母的时候直接在builder尾部添加c当c是[ 将Multi 入stack1 builder转换为字符串 入stack2 然后全部初始化将[之前的临时结果builder 入栈stack2 用来发现对应…