LeetCode 513. 找树左下角的值:深度优先搜索和广度优先搜索两种写法详解

513. 找树左下角的值

题目来源

513. 找树左下角的值

题目分析

在这道题目中,我们需要找到给定二叉树的最底层最左边的节点值。具体题目描述如下:

题目: 给定一个二叉树的根节点 root,请找出该二叉树的最底层最左边的节点的值。假设二叉树中至少有一个节点。
示例1

题目难度

  • 难度:中等

题目标签

  • 标签:树、深度优先搜索、二叉树

题目限制

  • 树中节点数目在范围 [1, 10^4]
  • -2^31 <= Node.val <= 2^31 - 1

解题思路

我们可以使用广度优先搜索 (BFS)深度优先搜索 (DFS) 两种方式来解决这个问题。

方法一:广度优先搜索 (BFS)

BFS 通过逐层遍历树的节点,可以很容易地找到最底层的节点。在每一层的遍历中,我们先从右到左处理节点,这样在遍历到最底层时,最后一个处理的节点就是最左边的节点。

核心思想:逐层遍历二叉树,每一层从右到左遍历,记录最后一层的最后一个节点的值。

BFS 算法步骤
  1. 初始化队列:将根节点加入队列。
  2. 遍历每一层:对于队列中的每一层,从右到左遍历节点,将当前节点值保存在变量中。
  3. 加入子节点:将当前节点的右子节点和左子节点(如果存在)按顺序加入队列。
  4. 返回结果:遍历完成后,返回保存的最后一个节点的值。

方法二:深度优先搜索 (DFS)

DFS 可以通过递归的方式实现,可以参考199. 二叉树的右视图最底层 最左边 节点可以理解为二叉树的左视图的最底层的节点,所以建立一个二叉树的左视图,返回最后的节点就是最底层最左边的节点了。在递归过程中,我们会记录当前的深度,并在每一层找到第一个节点值。最终返回最深层的第一个节点的值。

核心思想:使用递归遍历树,记录每一层第一个节点的值,并在递归完成后返回最深层的第一个节点。

DFS 算法步骤
  1. 初始化结果列表:用于存储每层的第一个节点值。
  2. 递归遍历:从根节点开始,按照左子树、右子树的顺序递归遍历二叉树,同时记录当前层的深度。
  3. 更新结果:如果当前层数等于结果列表的长度,则将当前节点的值加入结果列表中。
  4. 返回结果:遍历完成后,返回结果列表中最后一个值,即最底层最左边的节点值。

代码实现

以下是 BFS 和 DFS 两种方法实现找树左下角节点值的 Java 代码。

BFS 实现

public int findBottomLeftValue(TreeNode root) {
    Deque<TreeNode> queue = new LinkedList<>();
    TreeNode node = null;
    queue.add(root);
    while (!queue.isEmpty()) {
        int size = queue.size();
        for (int i = 0; i < size; i++) {
            node = queue.removeFirst();
            // 先入队右子树,再入队左子树
            if (node.right != null) {
                queue.add(node.right);
            }
            if (node.left != null) {
                queue.add(node.left);
            }
        }
    }
    // 最后一层的最后一个节点就是最底层最左边的节点
    return node.val;
}

DFS 实现

public int findBottomLeftValue2(TreeNode root) {
    // ans 保存每层第一个遍历到的节点的值
    List<Integer> ans = new ArrayList<>();
    leftReview(root, 0, ans);
    return ans.get(ans.size() - 1);
}

private void leftReview(TreeNode root, int deep, List<Integer> ans) {
    if (root == null) {
        return;
    }
    // 当前层数等于结果集的长度,则将当前节点的值加入结果集
    if (deep == ans.size()) {
        ans.add(root.val);
    }
    leftReview(root.left, deep + 1, ans);
    leftReview(root.right, deep + 1, ans);
}

代码解读

  • BFS:通过从右到左遍历每一层,最终队列中的最后一个节点值就是最底层最左边的节点值。
  • DFS:通过递归遍历树的每一层,记录每层第一个节点的值,最终返回最后一层的第一个节点值。

性能分析

BFS

  • 时间复杂度O(n),其中 n 是树中节点的总数,因为我们需要遍历所有节点。
  • 空间复杂度O(n),在最坏情况下,队列中可能需要存储一整层的节点。

DFS

  • 时间复杂度O(n),其中 n 是树中节点的总数,因为我们需要访问树中的每个节点一次。
  • 空间复杂度O(h),其中 h 是树的高度,递归调用栈的最大深度。

总结

这道题提供了使用 BFS 和 DFS 两种方式来寻找二叉树中最底层最左边的节点值的机会。BFS 和 DFS 各有优势,在不同场景中可以选择不同的算法来解决问题。


  • 11
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值