[leetcode] Find Bottom Left Tree Value
阿新 • • 發佈:2018-10-04
mos solution 需要 tco nod dot off tom rip
分析:題目翻譯一下:要求尋找一個二叉樹最底層,最左邊的數字。 第一個思路:想到用BFS,每層遍歷。保存每層的結果,並且想辦法找到最後一層的最左邊的數字。代碼如下:
Given a binary tree, find the leftmost value in the last row of the tree.
Example 1:
Input: 2 / 1 3 Output: 1
Example 2:
Input: 1 / 2 3 / / 4 5 6 / 7 Output: 7
Note: You may assume the tree (i.e., the given root node) is not NULL.
分析:題目翻譯一下:要求尋找一個二叉樹最底層,最左邊的數字。 第一個思路:想到用BFS,每層遍歷。保存每層的結果,並且想辦法找到最後一層的最左邊的數字。代碼如下:
1 class Solution { 2 public int findBottomLeftValue(TreeNode root) { 3 //BFS method 4 Queue<TreeNode> stack = new LinkedList<>(); //用隊列實現層次遍歷 5 List<Integer> list = newArrayList<>(); //用list保存每個層結果,如果有下一層,就覆蓋 6 7 int length = 0; 8 stack.offer(root); 9 while ( !stack.isEmpty() ){ 10 length = stack.size(); 11 for ( int i = 0 ; i < length ; i ++ ) { 12 TreeNode t = stack.poll(); 13 list.add(t.val);14 if (t.left != null) stack.offer(t.left); 15 if (t.right != null) stack.offer(t.right); 16 } 17 } 18 System.out.println(list); 19 return list.get(list.size()-length); 20 } 21 }
運行時間12ms,擊敗3.74%。顯然是個不好的方法,因為使用了list這個多余的空間。下面想辦法優化。
第二個思路:如果不用list,直接返回最後一個元素呢。這個時候想到層次遍歷需要從右往左遍歷,這樣最後一個訪問的元素就是最後一層最左邊的了。
1 class Solution { 2 public int findBottomLeftValue(TreeNode root) { 3 //BFS method 4 Queue<TreeNode> stack = new LinkedList<>(); //用隊列實現層次遍歷 5 6 int result = root.val; 7 stack.offer(root); 8 while ( !stack.isEmpty() ){ 9 int length = stack.size(); 10 for ( int i = 0 ; i < length ; i ++ ) { 11 TreeNode t = stack.poll(); 12 result = t.val; 13 14 if (t.right != null) stack.offer(t.right); 15 if (t.left != null) stack.offer(t.left); 16 } 17 } 18 //System.out.println(list); 19 return result; 20 } 21 }
運行時間7ms,這應該是非遞歸方法最快的了。
思路三:二叉樹類問題,肯定也是可以用遞歸來做的。
因為要判斷最底層,所以要增加一個level判斷第幾層。用遞歸最關鍵就是找到最左邊元素的判斷,這裏非常巧妙用一個level判斷。因為遞歸都是從左邊開始遞歸的,因此用一個level變量記錄當前遍歷到的最左邊的元素位於第幾層。
1 class Solution { 2 int res = 0; 3 int level = 0; 4 public int findBottomLeftValue(TreeNode root) { 5 res = root.val; 6 helper(root,0); 7 return res; 8 } 9 10 private void helper(TreeNode root, int curlevel) { 11 if ( root == null ) return; 12 if ( root.left == null && root.right == null ) { 13 res = curlevel > level?root.val:res; 14 level = Math.max(level,curlevel); 15 } 16 helper(root.left,curlevel+1); 17 helper(root.right,curlevel+1); 18 } 19 }
運行時間5ms。這個遞歸核心就在於如何判斷是不是最左邊的。
[leetcode] Find Bottom Left Tree Value