513.找树左下角的值(二叉树算法题)
513.找树左下角的值
力扣题目链接
给定一个二叉树的 根节点 root
,请找出该二叉树的 最底层 最左边 节点的值。
假设二叉树中至少有一个节点。
示例 1:
输入: root = [2,1,3] 输出: 1
示例 2:
输入: [1,2,3,4,null,5,6,null,null,7] 输出: 7
提示:
- 二叉树的节点个数的范围是
[1,104]
-231 <= Node.val <= 231 - 1
迭代法
本题使用层序遍历再合适不过了,比递归要好理解得多!
只需要记录最后一行第一个节点的数值就可以了。
如果对层序遍历不了解,看这篇二叉树:层序遍历登场! (opens new window),这篇里也给出了层序遍历的模板,稍作修改就一过刷了这道题了。
代码如下:
// 定义一个名为 Solution 的类,用于解决“寻找二叉树最底层最左侧的值”问题
class Solution {/*** 方法:findBottomLeftValue* 功能:返回给定二叉树中最底层(最后一层)中最左侧节点的值。* 算法思路:使用层序遍历(广度优先搜索,BFS),逐层处理节点。* 每一层的第一个节点就是该层最左边的节点。* 遍历到最后,res 保存的就是最后一层最左边的节点值。** @param root 二叉树的根节点* @return 最底层最左侧节点的值*/public int findBottomLeftValue(TreeNode root) {// 创建一个双端队列(Deque),用于实现层序遍历(BFS)// 使用 LinkedList 作为底层实现,支持高效地在队尾入队、队头出队Deque<TreeNode> deque = new LinkedList<>();// 将根节点入队,作为 BFS 的起点deque.offer(root);// 用于存储每一层最左边节点的值// 最终结果就是最后一层的最左节点值int res = 0;// 当队列不为空时,继续遍历// 每一次 while 循环处理二叉树的一层while (!deque.isEmpty()) {// 获取当前层的节点数量// 这个数量决定了 for 循环的次数,确保只处理当前层的所有节点int len = deque.size();// 遍历当前层的所有节点for (int i = 0; i < len; i++) {// 从队列头部取出一个节点(先进先出,保证层序)TreeNode node = deque.poll();// 判断是否是当前层的第一个节点(即最左侧节点)// 是的话,就更新结果 resif (i == 0) {res = node.val;}// 如果当前节点有左子节点,将其加入队列// 注意:先加入左子节点,再加入右子节点,保证从左到右的顺序if (node.left != null) {deque.offer(node.left);}// 如果当前节点有右子节点,也加入队列if (node.right != null) {deque.offer(node.right);}}// 当前层处理完毕,res 已更新为该层最左侧节点的值}// while 循环结束,说明已经遍历到最后一层// 此时 res 存储的就是最后一层最左侧节点的值return res;}
}