找到左下角的值

题目描述

力扣链接🔗

给定一个二叉树,在树的最后一行找到最左边的值。

找到左下角的值 - 图1

代码解析

需要注意的是,最左边不代表就是左下角的值,需要深度最大,且最左边的值。

递归法

  1. 确认递归的返回值和参数
    由于只需要返回最后左节点的值,所以一个变量即可,返回值为空。本题还需要类里的两个全局变量,maxLen用来记录最大深度,maxleftValue记录最大深度最左节点的数值。
  2. 递归中止条件
    当遇到叶子节点时,需要更新最大深度。并获取最大深度最左面的值。
  3. 单层逻辑
    在找最大深度的时候,递归的过程中依然要使用回溯。
  1. public int findBottomLeftValue(TreeNode root) {
  2. maxLeftValue = root.val;
  3. traverse(root, 0);
  4. return maxLeftValue;
  5. }
  6. int maxDeep = -1; // 全局变量 记录最大深度
  7. int maxLeftValue = 0; // 全局变量 最大深度最左节点的数值
  8. public void traverse(TreeNode root, int deep) {
  9. if (root == null) {
  10. return;
  11. }
  12. // 这里有个隐含条件,就是党到达最大深度时,只获取了第一个最左边(因为是前序遍历)
  13. // 而且使用的也是 > 符号,并没有 >= 符号
  14. if (root.left == null && root.right == null) {
  15. if (deep > maxDeep) {
  16. maxDeep = deep; // 更新最大深度
  17. maxLeftValue = root.val; // 获取最大深度左节点的值
  18. }
  19. return;
  20. }
  21. if (root.left != null) {
  22. deep++;
  23. traverse(root.left, deep);
  24. deep--; // 回溯
  25. }
  26. if (root.right != null) {
  27. deep++;
  28. traverse(root.right, deep);
  29. deep--; // 回溯
  30. }
  31. }

迭代法

层次遍历只需要找到最后一层的第一个节点即可。

  1. /**
  2. * 层序遍历
  3. *
  4. * @param root
  5. * @return
  6. */
  7. public int findBottomLeftValue(TreeNode root) {
  8. if (root.left == null && root.right == null) {
  9. return root.val;
  10. }
  11. Queue<TreeNode> queue = new LinkedList<>();
  12. int res = 0;
  13. queue.offer(root);
  14. while (!queue.isEmpty()) {
  15. int len = queue.size();
  16. res = queue.peek().val; // 取每行的第一个节点值,直到最后一行
  17. while (len > 0) {
  18. TreeNode node = queue.poll();
  19. if (node.left != null) queue.offer(node.left);
  20. if (node.right != null) queue.offer(node.right);
  21. len--;
  22. }
  23. }
  24. return res;
  25. }