1. 程式人生 > 實用技巧 >力扣 - 512. 找樹左下角的值

力扣 - 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