2015-07-13 150 views
0

我試圖解決樹中的問題,並陷入遞歸併編寫代碼。 但我不知道爲什麼它是這樣的!有人能幫如何編寫 給出了這樣的輸出 我的計劃是X = 0,Y = 0在二叉樹中遞歸

int height1(node *root,int x,int y) 

{ 

int val; 

    if(root==NULL) 
    return 1; 
    else 
    { 
     x=x+height1(root->left,x,y); 
     y=y+height1(root->right,x,y); 
     printf("x=%d and y=%d %d\n",x,y,root->data); 
     if(x>y) 
      return x; 
      else 
       return y; 
    } 

這只是一個粗略的工作,瞭解遞歸的流動。樹遍歷的 輸入爲50 40 70 45 30 44 48和值

 x y root->data 
     1 1 30 
     2 1 44 
     4 1 48 
     3 4 45 
     1 4 40 
     5  1 70 
     4 5  50 

它爲什麼會出這樣一來,在我的方式,它應該添加Y和X每一次這樣的值應該增加,

請給我一些建議,因爲每次我解決一個樹問題,我總是 卡在遞歸,任何人都可以建議什麼是正確的做法。

我明白,要弄清楚基礎條件是重要的,我知道如何找到。但不能得到輸出的結果。

我知道這裏有很多最有經驗的程序員 和我想,請給我一些建議,因爲我覺得他們也面臨着在遞歸一些問題,所以他們是如何解決this.How他們解決問題的遞歸當任何新的來。

我應該參考一些書還是應該解決一些程序。 所以請我想你的建議,所以我可以成爲這個好。

+0

這將是一個很多更容易理解,如果你ATLEAST解釋是什麼(不完全)的代碼是應該做的 – Paul

+0

這只是一個粗略的代碼來獲得程序的流程。當我試圖獲得樹的高度,並堅持這樣理解我寫了粗糙的代碼。 –

回答

1

該代碼通常具有相當奇怪的架構。你可以將兩個整數論點分開,它們是無用的。下一個問題:此代碼不計算除樹葉之外的任何節點。而且這段代碼也有一些邏輯錯誤(例如:if(root == NULL) return 1;會導致計數甚至不存在的節點)。一般來說,這可以實現簡單得多:

int height1(node *root){ 
    if(root == NULL) 
     return 0; 

    int l = height1(root->left); 
    int r = height1(root->right); 

    return (l < r ? r : l) + 1; 
} 
+0

是的,我知道在函數參數中沒有必要,我可以在其他任何地方定義它們,但是你的代碼和我的代碼會給出相同的輸出:)如果是,那麼怎麼做? –

+0

@SachinGodara不,我不這麼認爲,儘管這段代碼會給出正確的結果。一般來說,打印語句相當混亂,因爲節點是從葉子打印到根。我不認爲這會產生相同的結果。其實我仍然想知道你的代碼中的x和y如何實際上變得大於1 – Paul

+0

我將返回更大的值,並將它添加到以前的x和y值中,這就是我想知道的該代碼如何給出這個答案。 –