Loading

力扣 - 512. 找树左下角的值

题目

513. 找树左下角的值

思路1(BFS 广度优先搜索)

  • 本题用BFS好做,因为求得是最后一行的最左边的值
  • BFS广度优先搜索其实就是层序遍历
  • 层序遍历是一层一层的遍历,我们只需要在每层遍历开始将最左边的数记录下来即可
  • 遍历结束那个值就是结果了

代码

class Solution {
    public int findBottomLeftValue(TreeNode root) {
        Deque<TreeNode> q1 = new LinkedList<>();
        q1.offer(root);
        int res = 0;
        while (!q1.isEmpty()) {
            int size = q1.size();
            res = q1.peek().val;
            while (size > 0) {
                TreeNode node = q1.poll();
                if (node.left != null) {
                    q1.offer(node.left);
                }
                if (node.right != null) {
                    q1.offer(node.right);
                }
                size--;
            }
        }
        return res;
    }
}

复杂度分析

  • 时间复杂度:\(O(N)\),其中 N 为树的结点数量
  • 空间复杂度:\(O(N)\),其中 N 为树的结点数量

思路2(DFS 深度优先搜索)

  • 使用 DFS + 回溯 来获取结果
  • 由于我们是要获取最后一行的最左边的值,所以我们只需要一步一步找到最后一行即可
  • 搜索的叶子结点,那么就判断叶子结点是不是最深的,如果是的话,就更新当前最深深度和最左边的值

代码

class Solution {
    int maxLength = Integer.MIN_VALUE;
    int leftValue = 0;


    public int findBottomLeftValue(TreeNode root) {
        backTrack(root, 0);
        return leftValue;
    }

    public void backTrack(TreeNode node, int length) {
        if (node.left == null && node.right == null) {
            if (length > maxLength) {
                maxLength = length;
                leftValue = node.val;
            }
            return;
        }
        
        // 选择路径:left和right
        if (node.left != null) {
            // 添加选择
            length++;
            // 进入下一层决策树
            backTrack(node.left, length);
            // 删除选择
            length--;
        }
        if (node.right != null) {
            length++;
            backTrack(node.right, length);
            length--;
        }
    }
}

复杂度分析

  • 时间复杂度:\(O(N)\),其中 N 为树的结点数量
  • 空间复杂度:\(O(H)\),其中 H 为树的高度,即 logN
posted @ 2020-11-17 17:49  linzeliang  阅读(79)  评论(0)    收藏  举报