2017-11-25 102 views
-1

我正在編寫一個程序來嘗試獲取二叉樹中的樹葉數。我所做的是我檢查了當前ptr是否是一片葉子,如果不是,繼續前往下一個子樹。但是,當我運行它時,它不斷返回2.我做錯了什麼?二叉樹numLeaf算法不起作用

我沒有包含源代碼,因爲它相對標準(具有rLink,lLink等)。

template <class elemType> 
long int bSearchTreeType<elemType>::getLeaves(nodeType<elemType> * current, long int count) const { 
    if(current->rLink == NULL && current->lLink == NULL) { 
     count += 1; 
     return count; 
    } 
    if(current->rLink!=NULL) { 
     getLeaves(current->rLink); 
    } 
    if(current->lLink!=NULL) { 
     getLeaves(current->lLink); 
    } 
} 

template <class elemType> 
long int bSearchTreeType<elemType>::leaves() const { 
    if(this->root!=NULL) { 
     return this->getLeaves(this->root); 
    } 
} 

編輯:當我運行這個有沒有錯誤,我宣佈在參數列表數= 1的功能。這就是爲什麼我能夠做到這一點。

+0

在這兩個函數的第一個if語句返回的東西。其他的不這樣做,但是一個非void函數必須**總是以'返回值'結尾;'。 –

+0

首先獲取無警告編譯的代碼。我想你會在你這樣做的時候搞清楚。如果沒有,發佈一個MCVE。 https://stackoverflow.com/help/mcve –

+0

編譯器不會給出任何警告 –

回答

0

我發現了一些問題。

1)您打電話給return this->getLeaves(this->root);,但是在此代碼示例中沒有使用該方法簽名的方法。 bSearchTreeType<elemType>::getLeaves(nodeType<elemType> * current, long int count)

2)你的代碼不處理對樹的情況下current可以爲null即)像

 2 
    /
    1 

3)你沒有返回遍歷左,右子樹後,任何東西。

你可以寫這樣的事情

template <class elemType> 
long int bSearchTreeType<elemType>::getLeaves(nodeType<elemType> * current) 
{ 
    if(current == NULL) 
     return 0; 
    if(current->rLink == NULL && current->lLink == NULL) 
     return 1; 
    int leftSubTree = getLeaves(current->lLink); 
    int rightSubTree = getLeaves(current->rLink); 
    return leftSubTree + rightSubTree; 
}