2016-12-14 12 views
0

Я создал класс node.h, определяя класс, называемый node, для представления двоичного дерева (любого типа). Похоже, что конструктор не работает. Ошибки ниже. Я только начал писать конструкторы в таких классах, как это, и это первые встречающиеся бинарные деревья. Может ли кто-нибудь указать мне в правильном направлении, как исправить эти ошибки и заставить мой код работать? Благодарю. enter image description hereNode Class для представления двоичного дерева C++

node.h

#ifndef NODE_H 
#define NODE_H 
#include <iostream> 

//an object of type node holds 3 things 
// - an item (oftype t) 
// - a left subtree 
// - a right subtree 

template<typename T> 
class Node { 
public: 
    Node(T item); //constructor to create a leaf node 
    Node(T item, Node *lft, Node *rht); //constructor which creates an internal node 
    ~Node(); //Destructor 

    //public data member functions: 
    bool searchTree(T key); 
    void printTree(); 

private: 
    //private data member functions: 
    //.. 
}; 

//constructor 
template<typename T> 
Node<T>::Node(T i, Node<T> *l, Node<T> *r) { 
    item = i; 
    lft = NULL; 
    rht = NULL; 
} 

//constructor //is this correct? 
template <typename T> 
Node<T>::Node(T i) { //should i be a parameter here? 
    item = i; //is this right? 
} 

//destructor 
template <typename T> 
Node<T>::~Node() { 
    delete left; 
    delete right; 
    //delete; 
} 


//print tree method 
template <typename T> 
void Node<T>::printTree() { 
    if (lft != NULL) { 
     lft->printTree(); 
     cout << item << endl;//alphabetical order 
    } 

    if (rht != NULL) { 
     rht->printTree(); 
     //cout << item << endl; //post order 
    } 
} 

//search Tree method 
template <typename T> 
bool Node<T>::searchTree(T key) { 
    bool found = false; 
    if (item == key) { 
     return true; 
    } 
    if (left != NULL) { 
     found = left->searchTree(key); 
     if (found) return true; 
    } 
    if (right != NULL) { 
     return right->searchTree(key); 
    } 
    return false; //if left and right are both null & key is not the search item, then not found == not in the tree. 
} 

#endif 

main.cpp

#include "Node.h" 
#include <iostream> 
using namespace std; 

//set up tree method 
Node<string> *setUpTree() { 
    Node<string> *s_tree = 
     new Node<string>("Sunday", 
     new Node<string>("monday", 
     new Node<string>("Friday"), 
     new Node<string>("Saturday")), 
     new Node<string>("Tuesday", 
     new Node<string>("Thursday"), 
     new Node<string>("Wednesday"))); 
} 

int main() { 

    Node<string> *s_tree; 
    s_tree = setUpTree(); 

    cout << "Part 2 :Priting tree vals " << endl << endl; 
    s_tree->printTree(); 
    cout << endl; 

    //search for range of tree values 
    //searchTree(s_tree, "Sunday"); 
    //searchTree(s_tree, "Monday"); 

    return 0; 
} 
+0

Где вы определяете 'lft' и 'rht'? – PanicSheep

+0

Хорошее задание ... но что вы уже пробовали? – Mailerdaimon

ответ

1

Там нет заявлений членов, которые вы используете в конструкторе и другие методы. Компилятор не знает, что означает rht или right. Судя по вашему коду класс должен выглядеть следующим образом:

template<typename T> 
class Node { 
public: 
    Node(T item); //constructor to create a leaf node 
    Node(T item, Node *lft, Node *rht); //constructor which creates an internal node 
    ~Node(); //Destructor 

    //public data member functions: 
    bool searchTree(T key); 
    void printTree(); 

private: 
    Node* left; 
    Node* right; 
    T item; 
    //private data member functions: 
    //.. 
}; 

Так что теперь компилятор знает, что left, right и item означают. Теперь вы можете использовать эти идентификаторы внутри функций-членов этого класса. Обратите внимание, что компилятор до сих пор не знает, что такое rht или lft, поэтому вы должны заменить их right и left.

Надеюсь, это поможет

+0

спасибо за мой метод tree, вы знаете, почему я получаю сообщение об ошибке «set tree» должен вернуть значение? – Liam

+0

@Liam ваша сигнатура функции указывает, что функция всегда возвращает 'Node *', но в настоящее время это не так. Вы создаете локальную переменную 's_tree' этого типа, но не возвращаете ее из функции. Добавьте 'return s_tree', и он должен работать. –