C++ 模板二叉搜索树 - 参数列表错误

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

我想要的是一个相当简单的二叉搜索树,通过模板标签,允许在其中使用任何数字数据,但我有一些相当令人讨厌的问题,我不知道如何摆脱,如果有人可以提供帮助,将不胜感激。不断弹出的错误消息是“在没有参数列表的情况下无效使用模板名称‘BST’”——坦率地说,我不知道如何解决它。它出现在 bst.cpp 文件的第 31、89、105、120、130、141 行。鉴于我在二叉搜索树方面并不那么精通,我更喜欢尽可能确定的答案(甚至尽可能准确地提及需要更改的地方和内容):

main.cpp

#include <iostream>
#include "bst.h"

using namespace std;

int main()
{

    BST <int> tree;
    tree.insert(8);
    tree.insert(25);
    tree.insert(99);
    tree.insert(20);
    tree.insert(25);
    tree.insert(20);
    tree.insert(2);
    tree.insert(89);
    tree.insert(15);
    tree.insert(10);
    tree.insert(30);
    tree.insert(50);
    tree.displayorder();



    int number;

    int Inputnumber;
    while (true){
        cout << "Choose what you want to do: " << endl << "1# Insert" << endl << "2# Display Orders" << endl <<  "3# Search" << endl << "4# Delete" << endl << endl << endl;
        cin >> Inputnumber;
        if (Inputnumber==1){
            cout << endl << "Enter the number you want inserted: ";
            cin >> number;
            tree.insert(number);
            cout << endl << endl << endl;
        }
        if (Inputnumber==2){
            cout<<"Display Orders: " << endl;
            tree.displayorder();
            cout << endl << endl << endl;
        }

        if (Inputnumber==3){
            cout<<"Enter the number you want to search for: ";
            cin >> number;
            tree.search(number);
            cout << endl << endl << endl;
        }
        if (Inputnumber==4){
            cout << "Enter the number you want to remove: ";
            cin >> number;
            tree.remove(number);
            cout << endl << endl << endl;
        }
    }
}

BST.cpp

#include <iostream>
#include "bst.h"

using namespace std;

template <class T>
void BST<T>::preorder(node* tree)
{
    if(tree == NULL){
        return;
    }
    cout << tree->data << " ";
    inorder(tree->left);
    inorder(tree->right);
}



template <class T>
void BST<T>::postorder(node* tree)
{
    if(tree == NULL){
        return;
    }
    inorder(tree->left);
    inorder(tree->right);
    cout << tree->data << " ";
}

template <typename T>
BST::node* BST<T>::find(node* tree, T x)        //ERROR HERE
{
    if(tree == NULL)
        return NULL;
    else if(x < tree->data)
        return find(tree->left, x);
    else if(x > tree->data)
        return find(tree->right, x);
    else
        return tree;
}
template <typename T>
BST<T>::BST()
{
    root = NULL;
}

template <typename T>
BST<T>::~BST()
{
    root = makeEmpty(root);
}

template <class T>
void BST<T>::insert(T x)
{
    root = insert(x, root);
}

template <class T>
void BST<T>::remove(T x)
{
    root = remove(x, root);
}

template <class T>
void BST<T>::displayorder()
{
    inorder(root);
    cout << endl;
    preorder(root);
    cout << endl;
    postorder(root);
    cout << endl << endl;
}

template <class T>
void BST<T>::search(T x)
{
    if(root = find(root, x)){
        cout << endl << "Found!" << endl;
    }
    else{
        cout << endl << "Not Found!" << endl;
    }
}

template <class T>
BST::node* BST<T>::makeEmpty(node* tree)        //ERROR HERE
{
    if(tree == NULL)
        return NULL;
    {
        makeEmpty(tree->left);
        makeEmpty(tree->right);
        delete tree;
    }
    return NULL;
}




template <class T>
BST::node* BST<T>::insert(T x, node* tree)      //ERROR HERE
{
    if(tree == NULL)
    {
        tree = new node;
        tree->data = x;
        tree->left = tree->right = NULL;
    }
    else if(x < tree->data)
        tree->left = insert(x, tree->left);
    else if(x >= tree->data)
        tree->right = insert(x, tree->right);
    return tree;
}

BST::node* BST::findMin(node* tree)             //ERROR HERE
{
    if(tree == NULL)
        return NULL;
    else if(tree->left == NULL)
        return tree;
    else
        return findMin(tree->left);
}

BST::node* BST::findMax(node* tree)             //ERROR HERE
{
    if(tree == NULL)
        return NULL;
    else if(tree->right == NULL)
        return tree;
    else
        return findMax(tree->right);
}

template <typename T>
BST::node* BST<T>::remove(T x, node* tree)      //ERROR HERE
{
    node* temp;
    if(tree == NULL)
        return NULL;
    else if(x < tree->data)
        tree->left = remove(x, tree->left);
    else if(x > tree->data)
        tree->right = remove(x, tree->right);
    else if(tree->left && tree->right)
    {
        temp = findMin(tree->right);
        tree->data = temp->data;
        tree->right = remove(tree->data, tree->right);
    }
    else
    {
        temp = tree;
        if(tree->left == NULL)
            tree = tree->right;
        else if(tree->right == NULL)
            tree = tree->left;
        delete temp;
    }

    return tree;
}

template <class T>
void BST<T>::inorder(node* tree)
{
    if(tree == NULL){
        return;
    }
    inorder(tree->left);
    cout << tree->data << " ";
    inorder(tree->right);
}

BST.h

#ifndef BST_H
#define BST_H


template <class T>
class BST
{
    struct node
    {
        T data;
        node* left;
        node* right;
    };

    node* root;

    node* makeEmpty(node* tree);

    node* insert(T x, node* tree);

    node* findMin(node* tree);

    node* findMax(node* tree);

    node* remove(T x, node* tree);

    void inorder(node* tree);

    void preorder(node* tree);



    void postorder(node* tree);


public:
    BST();

    ~BST();


    node* find(node* tree, T x);

    void insert(T x);

    void remove(T x);

    void displayorder();

    void search(T x);
};

#endif // BST_H

最佳答案

例如,在

BST::node* BST<T>::find(node* tree, T x) 

你忘记了 <T>第一个组件 BST .

应该是

// vvv
BST<T>::node* BST<T>::find(node* tree, T x) 

所有其他错误都属于同一类型。

关于C++ 模板二叉搜索树 - 参数列表错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46560988/

相关文章:

c++ - 使用二叉树实现字典

c++ - 如何将数组的一半转移到另一个不同大小的数组?

c++ - 嵌套在模板类中的模板类的前向声明

templates - 有没有办法通过模板将 </onlyinclude> 包含到 MediaWiki 页面上?

C++二叉树错误: request for member (X) in (Y) which is of non-class type (Z)

java - 在树的图形表示中画线

C++0x 右值引用和临时对象

c++ - 函数语法引用 - 带和不带 &

c++ - 删除函数删除哈希表中的所有节点

c++ - 使用可变参数模板构建元组