二叉搜索树显示问题

时间:2014-11-09 20:43:50

标签: c++ templates binary-search-tree

我有一个实验室任务,我在过去几周一直在工作,我很困难,迫切需要帮助,因为这将是最终项目的50%左右。 分配是用C ++创建二进制搜索树。我们必须从“独立宣言”中读到二进制搜索树。我的搜索和插入方法“正常工作”意味着他们没有抛出任何错误。我遇到的问题是显示BST以确定一切是否正常工作。显示方法应由重载运算符>>调用。显示树。 我一直遇到的错误是:

  

“错误C3867:'BST :: display':缺少函数调用   参数列表;使用'& BST :: display'创建指针   构件“

另一个是

  

“错误C2679:二进制'<<' :找不到哪个操作员需要右手   “重载函数”类型的操作数(或者没有可接受的   转化率)。“

上次重建程序时,它显示“ItelliSense:指向绑定函数的指针只能用于调用函数。”

#include "stdafx.h"
#include <string> 
#include <iostream> 
#include <fstream> 
using namespace std; 

template <typename T> 
class BST{
private:
    struct node {
        T data; 
        struct node* left; 
        struct node* right; 
    };
    node* root; 

public: 
    BST()
    {
        root = NULL; 
    }
    bool isEmpty() const { return root == NULL; }
    ~BST(); 

template <typename T> 
void insert(T d)
{
    node* t = new node; 
    node* parent; 
    t->data = d; 
    t->left = NULL; 
    t->right = NULL; 
    parent = NULL; 

    if (isEmpty()) root = t; 
    else {
        node* current; 
        current = root; 
        while (current)
        {
            parent = current; 
            if (t->data > current->data) current = current->right; 
            else current = current->left; 
        }
        if (t->data < parent->data)
            parent->left = t;
        else
            parent->right = t; 
    }
}


template<typename T>
bool search(T d)
{
    if (root == NULL)
        return false;
    else if (d == root->item) {
        return true;
    }
    else if (d < root->item) {
        return search(root->left, d);
    }
    else {
        return search(root->right, d);
    }
}


template<typename T>
void display(node *p, std::ostream& os)
{
    if (p != NULL)
    {
        if (p->left) display(p->left); 
        os << " " << p->data << " "; 
        if (p->right) display(p->right); 
    }   
} 

template<typename T> friend std::ostream& operator<<(std::ostream& os, const BST<T>& obj)
{
    obj.display(os, obj.root);
}


};

int main( )
{
    BST<string> s; 
    ifstream inFile; 
    string word, tmp; 
    string filename = "Independence.txt"; 


    ifstream fstr(filename.c_str()); 
    while (inFile >> word) {
        s.insert(word); 
    }
    inFile.close(); 

    cout << s << std::endl; 

    cout << "Search for: ";
    cin.ignore(1);
    cin >> tmp;
    s.search(tmp);


    return 0;
};

4 个答案:

答案 0 :(得分:0)

template<typename T>
void display(node *p)

这将带有一个带有节点指针的参数。

然后你用以下方式调用它:

BST<string> s;
cout << s.display << endl; 

但是你实际上并没有在这里传递任何参数。然后编译器抱怨它无法弄清楚如何调用该函数。因为该函数的返回类型为void,所以无法确定如何打印它,因为您实际上没有为cout返回任何内容进行打印。在你继续前进之前,你会想要解决这两个问题,因为你说它是一项任务,我将让你知道如何做到这一点:)。

答案 1 :(得分:0)

您的代码似乎存在许多问题。我怀疑displaysearch不应单独模板化 - 这实际上是模板类中的模板成员函数,我不认为这是您的意图。此外,搜索功能引用node::item,但节点类型的声明具有node::data。最后,BST::display被写成一个void函数,它以一种可以被声明为静态的方式获取节点,但是你的用法就好像你希望它像成员函数一样工作。它不会返回任何内容,因此它无法传递给iostream :: operator&lt;&lt;。更好的方法是让显示将iostream作为输入,然后将其称为root->display(cout)display(cout, root),具体取决于您是希望它是成员函数还是静态函数。

答案 2 :(得分:0)

你有几个概念错误, display方法返回void,因此您无法将其传递给期望显示内容的cout。 因此,您可以轻松更改一个名为display_tree的新方法,如此

void display_tree()
{
    display(root);
}

并且在您的主要部分只调用方法

s.display_tree();

不喜欢这个

cout << s.display << std::endl; //this is wrong cause this is not even calling a method

另一种选择是覆盖&lt;&lt;运算符,但是像这样编辑你的diplay方法

template<typename T> void display(node *p, std::ostream& os)
{
    if (p != NULL)
    {
        if (p->left) display(p->left);
        os << " " << p->data << " ";
        if (p->right) display(p->right);
    }       

}

然后在课外

template<typename T> friend std::ostream& operator<<(std::ostream& os, const BST<T>& obj)
{
    obj.display(obj.root);
}

并像你这样在你的程序中调用它

cout << s << std::endl;

为了使其工作,T需要具有运算符&lt;&lt;重载(在你的情况下是字符串的情况)

尝试使用此代码 - 新版本编译

void display(node *p, std::ostream& os) const
{
    if (p != NULL)
    {
        if (p->left) display(p->left,os);
        os << " " << p->data << " ";
        if (p->right) display(p->right,os);
    }
}

template<typename T> friend std::ostream& operator<<(std::ostream& os, const BST<T>& obj)
{
    obj.display(obj.root,os);
    return os;
}

答案 3 :(得分:0)

以下是您的代码编译并修复了搜索

#include "stdafx.h"
#include <string> 
#include <iostream> 
#include <fstream> 
using namespace std;

template <typename T>
class BST{
private:
    struct node {
        T data;
        struct node* left;
        struct node* right;
    };
    node* root;

    template<typename T> bool search(node* p, T d)
    {
        if (!p) {
            return false;
        }
        if (d == p->data) {
            return true;
        }
        else if (d < p->data) {
            return search(root->left, d);
        }
        else {
            return search(root->right, d);
        }
    }

public:
    BST()
    {
        root = NULL;
    }
    bool isEmpty() const { return root == NULL; }
    ~BST();

    template <typename T>
    void insert(T d)
    {
        node* t = new node;
        node* parent;
        t->data = d;
        t->left = NULL;
        t->right = NULL;
        parent = NULL;

        if (isEmpty()) root = t;
        else {
            node* current;
            current = root;
            while (current)
            {
                parent = current;
                if (t->data > current->data) current = current->right;
                else current = current->left;
            }
            if (t->data < parent->data)
                parent->left = t;
            else
                parent->right = t;
        }
    }

    template<typename T> bool search(T d)
    {
        if (root == NULL)
            return false;
        else if (d == root->data) {
            return true;
        }
        else if (d < root->data) {
            return search(root->left, d);
        }
        else {
            return search(root->right, d);
        }
    }




    void display(node *p, std::ostream& os) const
    {
        if (p != NULL)
        {
            if (p->left) display(p->left,os);
            os << " " << p->data << " ";
            if (p->right) display(p->right,os);
        }
    }

    template<typename T> friend std::ostream& operator<<(std::ostream& os, const BST<T>& obj)
    {
        obj.display(obj.root,os);
        return os;
    }


};

int main()
{
    BST<string> s;
    ifstream inFile;
    string word, tmp;
    string filename = "Independence.txt";


    ifstream fstr(filename.c_str());
    while (inFile >> word) {
        s.insert(word);
    }
    inFile.close();

    cout << s << std::endl;

    cout << "Search for: ";
    cin.ignore(1);
    cin >> tmp;
    s.search(tmp);


    return 0;
};