【问题标题】:Counting number of nodes and leaf nodes in Binary Tree计算二叉树中节点和叶节点的数量
【发布时间】:2014-04-02 16:09:41
【问题描述】:

在计算二叉树的大小和二叉树中的叶子数量时遇到了一些麻烦。应该是一个简单的问题,但我仍然无法弄清楚。

所以我收到一个错误:“error: no matching function for call to âBinaryNode::BinaryNode(BinaryNode*&)â”。这发生在(我的 .cpp 文件的)第 218、219、230、232 行。所有这些都带有我的头文件中的注释:bet.h:6:注意:候选者是:BinaryNode::BinaryNode() BinaryNode::BinaryNode(const BinaryNode&)。这是我的头文件的第 6 行。所以这里是代码。首先是我的头文件(包含我的接口)的开头:

#include <string>

using namespace std;

struct BinaryNode
{                      //This is line 6
    string element;
    BinaryNode* leftNode;
    BinaryNode* rightNode;
};

class BET
{
public:
    BET();
    BET(const string postfix);
    BET(const BET&);
    ~BET();
    bool buildFromPostfix(const string postfix);
    const BET& operator= (const BET&);
    void printInfixExpression();
    void printPostfixExpression();
    size_t size();
    size_t leaf_nodes();
    bool empty();

private:
    void printInfixExpression(BinaryNode *n);
    void makeEmpty(BinaryNode* &t);
    BinaryNode* clone(BinaryNode* t) const;
    BinaryNode* headNode;
    void printPostfixExpression(BinaryNode *n);
    size_t size(BinaryNode *t);
    size_t leaf_nodes(BinaryNode *t);
};

接下来,这是我的 .cpp 文件中出现错误的部分。 (它们是私有函数):

/*----Public functions--(calls private functions)----*/

size_t BET::size(){
    size(headNode);
}

size_t BET::leaf_nodes(){
    leaf_nodes(headNode);
}

/*----Private functions--(returns num nodes)----*/

size_t BET::size(BinaryNode *t){
    if(t == NULL)
      return 0;
    else {
      int count = 1;
      count += BinaryNode(t->leftNode);    //line 218
      count += BinaryNode(t->rightNode);   //line 219
      return count;
    }
}

size_t BET::leaf_nodes(BinaryNode *t){
    int count = 0;
    if (t->leftNode == NULL && t->rightNode == NULL)
      count++;
    else {
      if (t->leftNode != NULL)
        count += BinaryNode(t->leftNode);    //line 230
      if (t->rightNode != NULL)
        count += BinaryNode(t->rightNode);   //line 232
    }
return count;
}

注意:我知道不建议将接口放在单独的文件中。但这是我必须这样做的方式。

【问题讨论】:

  • 为什么要调用构造函数而不是在这些行应用递归?

标签: c++ binary-tree


【解决方案1】:

您需要从这些函数中进行递归调用,但您尝试创建一个节点并将该节点添加到一个整数。你需要这样的改变:

count += leaf_nodes(t->leftNode); //BinaryNode(t->leftNode);    //line 230

【讨论】:

    【解决方案2】:

    您必须在对 BinaryNode 构造函数的调用中取消引用 BinaryNode* 指针,

    例如:

    BinaryNode(*(t->leftNode));
    

    或提供将 BinaryNode* 作为参数的 BinaryNode 构造函数。

    这还不是全部,因为正如已经提到的那样,像count += BinaryNode(t-&gt;leftNode); 这样的行不会起作用,因为您尝试将对象实例添加到整数,这没有多大意义。

    【讨论】:

    • 这只是问题之一。他这样做count += BinaryNode(...) 的事实并没有帮助,虽然你的回答确实解决了他现在遇到的编译器错误,但它只会导致新的错误。
    猜你喜欢
    • 1970-01-01
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    • 2023-03-25
    • 1970-01-01
    相关资源
    最近更新 更多