我如何计算二元搜索树中的比较?

时间:2015-12-04 03:13:23

标签: c++ binary-tree

我想知道如何添加一个代表我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;
}

2 个答案:

答案 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;以获取它。