题目
给定一个二叉树的 根节点 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来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-bottom-left-tree-value
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
层序遍历,最后一层的第一个元素就是答案。写法一是最直接的,写法二稍微有点巧妙。
代码
BFS写法一
/**
* Definition for a binary tree node.
* public 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 {
public int findBottomLeftValue(TreeNode root) {
Queue<TreeNode> q = new ArrayDeque<>();
q.offer(root);
int ans = 0;
while (!q.isEmpty()) {
int size = q.size();
for (int i = 0; i < size; i++) {
TreeNode cur = q.poll();
if (i == 0) {
ans = cur.val;
}
if (cur.left != null) {
q.offer(cur.left);
}
if (cur.right != null) {
q.offer(cur.right);
}
}
}
return ans;
}
}
BFS写法二
一个更巧妙的方法是先入队右孩子,这样可以保证左下角的节点最后一个出队。
class Solution {
public int findBottomLeftValue(TreeNode root) {
Queue<TreeNode> q = new ArrayDeque<>();
q.offer(root);
int ans = 0;
while (!q.isEmpty()) {
TreeNode cur = q.poll();
ans = cur.val;
if (cur.right != null) {
q.offer(cur.right);
}
if (cur.left != null) {
q.offer(cur.left);
}
}
return ans;
}
}
DFS
也可以进行深度优先搜索,递归时携带一个变量,表示当前高度,如果大于最大的高度就更新当前值为ans。
先访问左孩子可以保证更新ans时一定使用左孩子的值更新ans。
class Solution {
int maxh = -1;
int val = 0;
public int findBottomLeftValue(TreeNode root) {
dfs(root, 0);
return val;
}
private void dfs(TreeNode root, int h) {
if (root == null) {
return;
}
if (h > maxh) {
maxh = h;
val = root.val;
}
dfs(root.left, h + 1);
dfs(root.right, h + 1);
}
}