✨ 题目描述
给定一个二叉树的 根节点 root
,请找出该二叉树的 最底层 最左边 节点的值。
提示:
二叉树中至少有一个节点。
📄 示例
示例 1
输入: root = [2,1,3]
输出: 1
示例 2
输入: [1,2,3,4,null,5,6,null,null,7]
输出: 7
🔥 解题思路(深度优先搜索 DFS)
我们要找的是最底层、最左边的节点,因此需要注意:
最深层优先:记录当前的最大深度。
左节点优先:递归时先访问左子树,再访问右子树。
当遍历到一个比当前记录更深的节点时,更新答案。
详细步骤
定义两个全局变量:
curHeight
:当前遍历到的最大深度。curVal
:当前最底层最左节点的值。
从根节点开始进行深度优先搜索:
每到下一层,
height + 1
。先递归左子树,再递归右子树(保证左优先)。
当到达一个更深的节点时,更新
curHeight
和curVal
。
🧩 代码实现
// 定义二叉树结构
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
// 解决方案
class Solution {
int curHeight = 0; // 当前最大高度
int curVal = 0; // 当前最左节点值
public int findBottomLeftValue(TreeNode root) {
dfs(root, 0);
return curVal;
}
private void dfs(TreeNode root, int height) {
if (root == null) return;
height++;
// 先递归左子树
dfs(root.left, height);
// 再递归右子树
dfs(root.right, height);
// 如果当前高度大于之前的最大高度,更新
if (height > curHeight) {
curHeight = height;
curVal = root.val;
}
}
}
⚡ 复杂度分析
时间复杂度:
O(N)
,其中N
是节点数量,需要遍历所有节点一次。空间复杂度:
O(H)
,其中H
是树的高度(递归栈空间)。
📌 小结
这道题考察的是DFS 深度优先搜索的基本功。
特别注意要先遍历左子树,这样才能确保找到“最左”的节点。
🎯 其他解法(拓展阅读)
实际上,这题也可以用**BFS(广度优先搜索)**来做,使用队列层层推进,最后一层的第一个节点即是答案!
如果你想了解 BFS 解法,欢迎点赞收藏,我会在评论区继续补充完整~
❤️ 如果觉得有帮助,欢迎【点赞】【收藏】【关注】支持我!
你的支持就是我更新的最大动力!一起来刷题提升吧~