算法——BFS题目
2021/10/20 17:11:08
本文主要是介绍算法——BFS题目,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
在每个树行中找最大值
需要在二叉树的每一行中找到最大的值
输入:
1 / \ 3 2 / \ \ 5 3 9
输出: [1, 3, 9]
思路
- 这是一道典型的BFS题目 BFS的套路其实就是维护一个queue队列 在读取子节点的时候同时把发现的孙子节点push到队列中
但是先不处理 等到这一对列中的子节点处理完成之后 下一轮再继续处理的就是孙子节点 这就实现了层序遍历 也就是一层层的去处理 - 但是这里有一个问题,就是如何知道处理的节点是哪个层级的 在最开始的时候我尝试写了一下二叉树求某个index所在层级的公式 但是发现这种公式只能处理[平衡二叉树]
层级的思路:
其实就是在每一轮while循环里 再开一个for循环 这个for循环的终点是[提前缓存好的length快照],也就是进入这轮while循环时,queue的长度 其实这个长度就恰好代表了[一个层级的长度]
缓存后 for循环里可以安全的把子节点push到数组里而不影响缓存的当前层级长度
另外:在for循环处理完成后 应该要把queue的长度截取掉上述的缓存长度 一开始使用的是queue.spice(0,len),速度只击败30%的人,后面换成for循环中一个一个shift来截取 速度就击败了77%的人
/** * @param {TreeNode}root * @return {number[]} */ let largestValues = function(root){ if(!root) return [] let queue = [root] let maximums = [] while(queue.length){ let max = Number.MIN_SAFE_INTEGER; // 这里需要先缓存length 这个length代表当前层级的所有节点 // 在循环开始后 会push新的节点 length就不稳定了 let len = queue.length; for(let i = 0; i<len;i++){ let node = queue[i] max = Math.max(node.val,max) if(node.left){ queue.push(node.left) } if(node.right){ queue.push(node.right) } } // 本层级处理完毕 截取掉 for(let i = 0; i<len;i++){ queue.shift() } // 这个for循环结束后 代表当前层级的节点全部处理完毕 // 直接把计算出来的最大值push到数组里面即可 maximums.push(max) } return maximums }
这篇关于算法——BFS题目的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-07如何利用看板工具优化品牌内容创作与审批,确保按时发布?
- 2025-01-07百万架构师第十一课:源码分析:Spring 源码分析:Spring源码分析前篇|JavaGuide
- 2025-01-07质量检测标准严苛,这 6 款办公软件达标了吗?
- 2025-01-07提升品牌活动管理的效率:看板工具助力品牌活动日历的可视化管理
- 2025-01-07宠物商场的精准营销秘籍:揭秘看板软件的力量
- 2025-01-07“30了,资深骑手” | 程序员能有什么好出路?
- 2025-01-07宠物公园的营销秘籍:看板软件如何帮你精准触达目标客户?
- 2025-01-07从任务分解到资源优化:甘特图工具全解析
- 2025-01-07企业升级必备指南:从传统办公软件到SaaS工具的转型攻略
- 2025-01-07一文告诉你IT项目管理如何做到高效