持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第24天,点击查看活动详情
每日刷题 2022.06.22
- leetcode原题链接:leetcode.cn/problems/fi…
- 难度:中等
- 方法:dfs, bfs
题目
- 给定一个二叉树的 根节点
root,请找出该二叉树的 最底层 最左边 节点的值。 - 假设二叉树中至少有一个节点。
示例
- 示例1
输入: root = [2,1,3]
输出: 1
- 示例2
输入: [1,2,3,4,null,5,6,null,null,7]
输出: 7
提示
- 二叉树的节点个数的范围是
[1,10^4] -2^31 <= Node.val <= 2^31 - 1
解题思路
- 最底层的最左边,不一定是左节点,最底层也有可能是有几点,因为最底层可能是叶子节点,它没有下一个左边和右边的节点,那么当前它作为根就是我们要找的节点。
- 深度遍历
dfs,每次先找的是左边的节点,那么当两个节点是同一个深度的时候,一定是只记录第一个depth > max。 - 以后再遇到树🌲相关的题目的时候,需要回顾:层序遍历、中序/前序/后序、深度遍历
层序遍历bfs
- 层序遍历就是遍历树🌲的每一层,依次再将每一层的节点的左右节点放入到队列中,从而实现层序遍历。层序遍历的时候,也是先遍历树🌲的左节点再遍历树🌲的右节点。
- 那么就可以依靠层序遍历的性质,取每一层开始的第一个节点(因为先遍历的是树的左节点),就是树🌲的最底层,最左边的值。
深度遍历dfs
- 深度遍历是优先深度,那么我们就可以将每个节点的深度记录📝下来,因为深度遍历也是先遍历左节点,因此我们只需要记录找到的最深的深度的第一个节点就可以。那么就将比较结果设置为
>,这样在第一次记录了最大的结果(左节点)后,有节点就不会被记录。
AC代码
var findBottomLeftValue = function(root) {
// 最底层,那么就应该想到树有两种遍历方式:层序遍历和深度遍历、中序遍历、前序和后序遍历
// 层序遍历:一般使用的是bfs, 而深度、中序、前序和后序都是dfs
// 找到最底层的最左边的节点,也就是找到最后一层的第一个节点
let queue = [root], ans = root.val;
while(queue.length != 0) {
let len = queue.length;
ans = queue[0].val;
for(let i = 0; i < len; i++) {
// 遍历每一层的每一个节点
let cur = queue.shift();
// console.log('cur:::', cur)
if(cur.left != null) queue.push(cur.left);
if(cur.right != null) queue.push(cur.right);
// console.log(queue, cur.left)
}
}
return ans;
};