我想知道如何添加一个代表我BST中比较次数的计数器。我添加了一个计数器,但我的printTree函数由于某种原因我持续计数为0。我想计算打印功能中的比较次数吗?或者我应该有一个专门用于计算比较次数的单独功能吗?
#include <iostream>
#include <cstdlib>
#include <fstream>
using namespace std;
struct node
{
int data;
node* left;
node* right;
};
node* root = NULL;
node* createLeaf(int data)
{
node* n = new node;
n->data = data;
n->left = NULL;
n->right = NULL;
return n;
}
void addLeaf(node* &curr, int data)
{
//If curr = NULL then add node
if(curr == NULL)
{
curr = createLeaf(data);
}
//Left(Less than)
else if(data <= curr->data)
{
addLeaf (curr->left, data);
}
//Right(greater than)
else if(data >= curr->data)
{
addLeaf(curr->right, data);
}
}
int printTree(node* Ptr, ofstream& NewData, int count)
{
//Check if tree is empty
if(root != NULL)
{
return count++;
if(Ptr->left != NULL)
{
printTree(Ptr->left, NewData, count);
}
NewData << Ptr->data; //Store Data in output file
NewData << endl;
cout << Ptr->data << " ";
if(Ptr->right != NULL)
{
printTree(Ptr->right, NewData, count);
}
}
else
{
cout << "The Tree is empty\n";
}
return Ptr->data;
}
int main()
{
ifstream dataFile;
dataFile.open("Data.txt.");
int temp, count;
count = 0;
while(dataFile)
{
dataFile >> temp;
addLeaf(root, temp);
}
dataFile.close();
ofstream NewData;
NewData.open("NewData.txt");
count = printTree(root, NewData, count);
cout << "count:" << count;
NewData.close();
system("PAUSE");
return 0;
}
答案 0 :(得分:1)
只需通过引用传递count变量(或使用指针。示例使用按引用传递)然后递增而不返回,这将为您提供一种计算比较次数的简单方法。您编写的代码片段如下所示。
注意:对于将来参考的帖子,如果要返回,则返回的值将不会执行任何操作。例如使用cascade.ALL, cascade.DELETE
代替return ++count;
。这就是为什么你的计数变量的值为零的原因。解释此行为的一种简单方法是,当您返回后递增值时,它返回值并在递增之前存在该函数。虽然根据我对代码的理解,你真的不想返回计数变量。
return count++;
答案 1 :(得分:0)
我通过定义一个主要用于计算比较的小类来做到这一点:
template <class T>
struct holder {
static int count;
T t;
holder(T T) : t(t) {}
operator T() const { return t; }
operator <(T const &r) { ++count; return t < r.t; }
};
int holder::count = 0;
然后一个节点将保存这些实例,而不是直接保存int
:
struct node {
holder<int> data;
node *left;
node *right;
};
使用您的树进行工作,当您想知道到目前为止已完成的比较次数时,请查看holder<int>::count;
以获取它。