513. 找树左下角的值

157 阅读2分钟

题目介绍

力扣513题:leetcode-cn.com/problems/fi…

image.png

image.png

方法一:递归

咋眼一看,这道题目用递归的话就就一直向左遍历,最后一个就是答案呗?没有这么简单,一直向左遍历到最后一个,它未必是最后一行啊。

我们来分析一下题目:在树的最后一行找到最左边的值。首先要是最后一行,然后是最左边的值。如果使用递归法,如何判断是最后一行呢,其实就是深度最大的叶子节点一定是最后一行。所以要找深度最大的叶子节点。

那么如果找最左边的呢?可以使用前序遍历,这样才先优先左边搜索,然后记录深度最大的叶子节点,此时就是树的最后一行最左边的值。

代码如下:

/**
 * 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 {
    //存储当前的最大深度
    int maxLevel = 0;
    int result;

    public int findBottomLeftValue(TreeNode root) {
        dfs(root,0);
        return result;
    }

    public void dfs(TreeNode root,int level) {
        if(root == null) {
            return;
        }
        //深度+1
        level++;
        //遍历到叶子节点
        if(root.left == null && root.right == null) {
            //如果当前深度大于最大深度,则更新最大深度信息以及result信息
            if(level > maxLevel) {
                maxLevel = level;
                result = root.val;
            }
        }
        //往左子节点遍历
        if(root.left != null) {
            dfs(root.left , level);
        }

        //往右节点遍历
        if(root.right != null) {
            dfs(root.right , level);
        }
    }
}

方法二:层序遍历

这其实很容易能够想到对二叉树进行层序遍历,然后将每一个的结果集合存起来,然后我只需要取出最后一行的第一个元素即可,代码如下:

class Solution {
    
    public int findBottomLeftValue(TreeNode root) {
        List<List<Integer>> result = traverse(root);
        //取出层序最后一行的第一个元素,就是结果
        return result.get(result.size() - 1).get(0); 
    }

    public List<List<Integer>> traverse(TreeNode root) {
         List<List<Integer>> result = new ArrayList<>();
         Queue<TreeNode> queue = new ArrayDeque<>();
         queue.add(root);
         while (!queue.isEmpty()) {
            List<Integer> dataList = new ArrayList<>();
            int n = queue.size();
            for(int i = 0 ;i < n ; i++) {
                TreeNode temp = queue.poll();
                dataList.add(temp.val);
                if(temp.left != null) {
                    queue.add(temp.left);
                }

                if(temp.right != null) {
                    queue.add(temp.right);
                }
            }
            result.add(dataList);
         }
         return result;
    }
}