2017-11-25 508 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; 
}