「LeetCode」515-在每个树行中找最大值

109 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第26天,点击查看活动详情

一.题目:

515. 在每个树行中找最大值 给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。

示例1:

image.png

输入: root = [1,3,2,5,3,null,9]
输出: [1,3,9]

示例2:

输入: root = [1,2,3]
输出: [1,3]

提示:

  • 二叉树的节点个数的范围是 [0,10^4]
  • -2^31 <= Node.val <= 2^31 - 1

二、思路分析:

首先我们看到题目写着二叉树我们就能够确定我们的策略,随后看到求出二叉树中每一层的最大值我们直接就锁定利用层序遍历完成相应的操作,当然这道题也可以利用深度遍历去记录层数,记录层数的同时记录每一层的节点值随后比较选出每一层的最大值。但是对于这道题层序遍历的思路是最简单的,基本步骤如下:

  • 创建一个类似队列的结构,将根节点放入队列里面,while循环的判断条件就是判断队列内是否为空。
  • 随后在将根节点出队,找到它的左右子树继续进行操作,每次内部循环都要找到最大值放入结果集中去。
  • 一直到最外层while循环结束我们就能够得到每一层的最大值。

三、代码:

/**
 * Definition for a binary tree node.
 * class TreeNode {
 *     val: number
 *     left: TreeNode | null
 *     right: TreeNode | null
 *     constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.left = (left===undefined ? null : left)
 *         this.right = (right===undefined ? null : right)
 *     }
 * }
 */

function largestValues(root: TreeNode | null): number[] {
    const res: number[] = [];
    if(root === null) return res;
    const queue:TreeNode[] = [root];
    while(queue.length){
        let n = queue.length;
        let minValue = Number.MIN_SAFE_INTEGER;
        for(let i=0 ; i<n ; i++){
            let vNode = queue.shift();
            minValue = Math.max(vNode.val, minValue);
            if(vNode.left !== null){
                queue.push(vNode.left);
            }
            if(vNode.right !== null){
                queue.push(vNode.right);
            }
        }
        res.push(minValue);
    }
    return res
};

四、总结:

对于二叉树的题目中,题目写明要求对某一层或者每一层操作的时候,我们都可以利用层序遍历去完成相应的操作,思路清晰代码框架也不需要考虑太多。