leetcode-找树左下角的值

65 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第27天,点击查看活动详情

题目描述

给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。

假设二叉树中至少有一个节点。

 

示例 1:

513-1.jpg

输入: root = [2,1,3]
输出: 1

示例 2:

513-2.jpg

输入: [1,2,3,4,null,5,6,null,null,7]
输出: 7
 

提示:

  • 二叉树的节点个数的范围是 [1,104]
  • -231 <= Node.val <= 231 - 1 

思路

可以使用广度优先遍历,从右往左遍历每一层的每个节点,那么最后一个遍历到的节点就是我们所求解的值。按照层来遍历的方法是,定一个一个Queue,先把根节点放入这个Queue,然后循环从这个Queue中获取节点,获取到节点后,如果存在子节点,就把子节点也放入到这个Queue中,因为Queue是先进先出的,而且一开始只有一个根节点,即第0层的所有节点,所以这某一层的节点遍历完成之前,不会遍历到下层的节点,每一层的所有节点在这个Queue中是连续挨在一起的。由于我们要求解的是左下角的值,所以我们把子节点放入Queue的顺序是先放右子节点,再放左子节点,这样在同一层中,右边的节点肯定比左边的节点先遍历到,同时满足

  • 上层节点比下层节点先遍历到
  • 同一层中,右侧节点比左侧节点先遍历到 这样,我们最后一个遍历到的节点,就是这个树左下角的节点了。

Java版本代码

class Solution {
    public int findBottomLeftValue(TreeNode root) {
        Queue<TreeNode> queue = new ArrayDeque<>();
        queue.offer(root);
        int ans = root.val;
        while (!queue.isEmpty()) {
            TreeNode node = queue.poll();
            ans = node.val;
            if (node.right != null) {
                queue.offer(node.right);
            }
            if (node.left != null) {
                queue.offer(node.left);
            }
        }
        return ans;
    }
}