携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第30天,点击查看活动详情
一、题目
LeetCode 二叉树最底层最左边的值
给定一个二叉树的 根节点 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
二、题解
需要找到给定二叉树中最深层节点中最左边的节点值,二叉树最少含有一个节点。
方法一
对此可以遍历二叉树节点来寻找,首先可以通过dfs深度优先搜索遍历,遍历就使用先遍历左子树节点再遍历右子树节点的方式,遍历过程中记录需要记录最大层级和最左节点值。具体的使用dfs递归遍历二叉树,参数需要一个树的根节点root和当前遍历节点的层级level,同时需要维护最大层级maxLevel和最左节点值val,遍历过程中实时更新最大层级maxLevel和最左节点值val。递归判断遍历的根节点root为空的话就结束,然后递归遍历之前先给当前层级level加一,然后递归的遍历左子树和右子树节点,最后判断节点层级,如果当前层级大于记录的最大层级,说明新遍历到了一层节点,那就记录当前遍历的节点值为最左节点值,同时更新最大层级就好了。
方法二
同时也可以使用bfs深度优先搜索遍历二叉树节点,需要使用队列辅助遍历,每次队列存储的节点都是同一层的节点,然后取出节点将节点的右子树加入到队列,然后再加入左子树到队列中,这样一直遍历到最后的一个节点就是最底层最左边的节点,所以可以实时更新遍历的节点为最左节点值,这样最后遍历结束的记录返回即可。
三、代码
方法一 Java代码
class Solution {
int val = 0;
int maxLevel = 0;
public int findBottomLeftValue(TreeNode root) {
dfs(root, 0);
return val;
}
public void dfs(TreeNode root, int level) {
if (root == null) {
return;
}
level++;
dfs(root.left, level);
dfs(root.right, level);
if (level > maxLevel) {
maxLevel = level;
val = root.val;
}
}
}
时间复杂度:O(n),需要遍历二叉树节点。
空间复杂度:O(n),递归需要消耗的栈空间。
方法二 Java代码
class Solution {
public int findBottomLeftValue(TreeNode root) {
int val = 0;
Queue<TreeNode> queue = new ArrayDeque<TreeNode>();
queue.offer(root);
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
if (node.right != null) {
queue.offer(node.right);
}
if (node.left != null) {
queue.offer(node.left);
}
val = node.val;
}
return val;
}
}
时间复杂度:O(n),需要遍历二叉树节点。
空间复杂度:O(n),遍历需要队列辅助。