2014-12-07 2 views
0

У меня есть проект, который должен быть в понедельник вечером. Проект состоит в реализации Red Black Tree, который читает в декларации независимости как «Independence.txt» и помещает эти строки в красное черное дерево. Я пытаюсь реализовать его как двоичное дерево поиска сначала, а затем добавит цвета и вращения, поскольку у меня уже есть этот код.Двоичный поиск Дерево чтения в строках? C++

Проблема, с которой я столкнулся, заключается в том, что прямо сейчас я продолжаю получать следующие ошибки: «ошибка C2660« RBT :: Insert »: функция не принимает 1 аргумент» и «IntelliSense: не соответствующая функция преобразования из« std: строка "в" RBT :: RBTNode * "существует, а затем IntelliSense: слишком мало аргументов в вызове функции, указывающих на строку root.Insert (myString);

Мне также нужна помощь при чтении в файле в двоичном формате дерево поиска. Я думаю мой метод вставки правильно, и проблема заключается в основном методе.

Спасибо за любую помощь, как я застрял.

#include "stdafx.h" 
#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

template<typename T> 
class RBT 
{ 
    struct RBTNode { 
     T data; 
     RBTNode* left; 
     RBTNode* right; 
    }; 

public: 
    RBT(); 
    ~RBT(); 
    void GetNewNode(RBTNode* root, T data); 
    void Insert(RBTNode* root, T data); 
    bool Search(); 
    void Display(); 

}; 


template <typename T> 
void RBT<T>::GetNewNode(RBTNode* root, T data) { 
    RBTNode* newNode = new RBTNode(); 
    newNode->data = data; 
    newNode->left = newNode->right = NULL; 
    return newNode; 
} 

template <typename T> 
void RBT<T>::Insert(RBTNode* root, T data) { 
    if (root == NULL) { 
     root = GetNewNode(data); 
    } 
    else if (data <= root->data) { 
     root->left = Insert(root->left, data); 
    } 
    else { 
     root->right = Insert(root->right, data); 
    } 
    return root; 
} 

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

template<typename T> 
void RBT<T>::Display() { 
    if (root->left != NULL) 
     display(root->left); 
    cout << root->left << endl; 

    if (root->right != NULL) 
     Display(root->right); 
    cout << root->right << endl; 
} 



int main() 
{ 
    RBT<string> root; 
    string myString; 
    ifstream infile; 
    infile.open("Independence.txt"); 
    while (infile) 
    { 
     infile >> myString; 
     root.Insert(myString); 
    } 

    cin.ignore(); 
    return 0; 
} 
+0

RBTNode * newNode = new BstNode(); – schwer

ответ

2

Ваш метод Insert принимает 2 аргумента (корень для вставки и данные для вставки); в main, вы вызываете его всего за 1 (данные).

+0

Что бы я вложил в вызов метода из main? RBTNode * root или просто root? Я попытался оба и получить сообщение об ошибке «ошибка C2664:« void RBT :: Insert (RBT :: RBTNode *, T) »: невозможно преобразовать аргумент 1 из« RBT »в« RBT :: RBTNode * ' – user2288502

+0

'RBTNode' является внутренним для вашего класса, поэтому звучит так, как будто вам нужна дополнительная версия' Insert', которая может быть вызвана извне класса, который затем, в свою очередь, может вызвать вашу текущую 'Insert' с соответствующим' RBTNode '. –

+0

Теперь я получаю сообщение об ошибке C224: 'RBT :: Insert': не удалось сопоставить определение функции с существующей декларацией« Любые идеи? Я пытаюсь исследовать эту проблему и видеть, что она дает мне – user2288502

Смежные вопросы