力扣 - 512. 找樹左下角的值
阿新 • • 發佈:2020-11-18
目錄
題目
思路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