持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第26天,点击查看活动详情
一、题目
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
二、题解
需要根据给定的二叉树查询左下角节点的值,就是最底层最左边的一个节点值,如果只有一个节点那么这个节点也算是左下角节点。
方法一
题目是需要找的是最左边最下层的节点,那么可以针对每一层来找,将二叉树节点分层,先找到每一层的最左节点,然后往下遍历层,对于每一层都找寻最左节点,然后找到最低层的时候的最左节点就可以了,可以通过深度优先搜索来遍历完成。具体的使用一个lev记录遍历层级的高度,然后用node就记录lev层中最左边节点的值,初始的话lev和node都为0。然后使用dfs递归遍历二叉树,参数需要一个root树的根节点以及height记录遍历节点的层级。递归首先判断root根节点为空时就结束,然后记录已经到达下一层,先将左子树去递归遍历,再将右子树去递归遍历,然后判断如果height大于记录的lev层就需要更新lev值以及node值,说明这个是新的一层,同时也是从左节点开始的,最后遍历结束返回最后一层的最左边节点值也就是node即可。
方法二
同样的按层遍历,根据树的右节点到左节点的遍历,当遍历结束时的最后一个节点就是最底层的最左节点,可以通过广度优先搜索来完成。首先需要使用一个队列来辅助遍历,先将树的根节点加入队列,然后遍历队列的元素,然后取出队列的一个元素节点,将这个元素节点的右子树节点和左子树节点分别依次加入队列后边(如果子树节点不为空的话),最后还需要一个node变量来记录节点值,每遍历一个节点就更新node的节点值,因为都是从右节点到左节点的遍历,所以当遍历完树节点的时候最后一个节点的值其实也就是树左下角的值。
三、代码
方法一 Java代码
class Solution {
int node = 0;
int lev = 0;
public int findBottomLeftValue(TreeNode root) {
int curHeight = 0;
dfs(root, 0);
return node;
}
public void dfs(TreeNode root, int height) {
if (root == null) {
return;
}
height++;
dfs(root.left, height);
dfs(root.right, height);
if (height > lev) {
lev = height;
node = root.val;
}
}
}
时间复杂度:O(n),需要遍历树节点。
空间复杂度:O(n),递归使用的栈空间。
方法二 Java代码
class Solution {
public int findBottomLeftValue(TreeNode root) {
int value = 0;
Deque<TreeNode> deque = new ArrayDeque<TreeNode>();
deque.offer(root);
while (!deque.isEmpty()) {
TreeNode node = deque.poll();
if (node.right != null) {
deque.offer(node.right);
}
if (node.left != null) {
deque.offer(node.left);
}
value = node.val;
}
return value;
}
}
时间复杂度:O(n),需要遍历一次二叉树的所有节点。
空间复杂度:O(n),广度优先搜索需要使用一个队列辅助遍历。