2015-10-19 77 views
0

我正在此本文給出了問題:這兩個代碼找到二叉樹的最大深度有什麼區別?

https://leetcode.com/problems/maximum-depth-of-binary-tree/

給定一個二叉樹,找到它的最大深度。

最大深度是從根節點到最遠葉節點沿最長路徑的節點數。

工作代碼:

public class Solution { 
    public int maxDepth(TreeNode root) { 

     if(root == null) 
      return 0; 

     int left = maxDepth(root.left); 
     int right = maxDepth(root.right); 

     if(left > right) 
      return left + 1; 
     else 
      return right + 1; 
    } 
} 

非工作代碼:

public class Solution { 
    int left = 0; 
    int right = 0; 
    public int maxDepth(TreeNode root) { 

     if(root == null) 
      return 0; 

     left = maxDepth(root.left); 
     right = maxDepth(root.right); 

     if(left > right) 
      return left + 1; 
     else 
      return right + 1; 
    } 
} 

有人能解釋爲什麼一個不工作?遞歸會傷害我的頭。

+1

*「有人可以解釋他們爲什麼都不起作用嗎?」*你說第一個*做*工作。 –

+1

等一下,它說了一個工作代碼,而不是工作代碼,然後問爲什麼他們都不工作。有點困惑 – bmarkham

+0

頭仍然傷害 –

回答

4

在第一個例子,你說過的作品,leftright局部變量maxDepth,所以每次調用maxDepth有他們自己的私有副本,其他調用maxDepth不能改變。

在第二個例子中,leftright是實例字段,因此該實例的所有來電maxDepth份額他們。因此,當maxDepth自己調用時,它會覆蓋leftright中的值。例如,在這裏:

left = maxDepth(root.left); 
right = maxDepth(root.right); 

...第一次調用返回left的值,然後將其覆蓋由第二個電話,因爲第二次調用也做left = maxDepth(root.left);。此外,如果您最終進一步遞歸(您可能會這樣做),則會覆蓋leftright