1. 程式人生 > >[leetcode] Find Bottom Left Tree Value

[leetcode] Find Bottom Left Tree Value

mos solution 需要 tco nod dot off tom rip

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 = new
ArrayList<>(); //用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