Невозможно распечатать значения карты / дерева - PullRequest
0 голосов
/ 05 апреля 2020

Я работаю над заданием, в котором я должен создать шаблонный класс Map, используя двоичное дерево поиска. Таким образом, в основном, чтобы сделать собственную карту вместо STL. Цель состояла в том, чтобы написать конструктор, деструктор и опубликованную c функцию обхода.

Сейчас я пытаюсь напечатать значения узлов, но моя программа, похоже, просто пропускает выполненный вызов обхода , Я предполагаю, что это потому, что я не вставляю новые узлы должным образом. Где я делаю ошибку?

CMap.h

#ifndef CMAP_H
#define CMAP_H
#include <iostream>
using namespace std;

template <typename K, typename V>
class CMap{
    public:
        CMap();
        ~CMap();
        V& operator[](const K& key);
        void traverse(void(*f) (const K& key, const V& value)) const;

    private:
        class Node {
            public:
                K key;
                V value;
                Node* leftPtr;
                Node* rightPtr;
                Node(const K& ky) : key(ky), value(0), leftPtr(NULL), rightPtr(NULL) {}

        };
    Node* root;
    void deleteTree(Node* root);  // Destructor calls this function
    Node* find(Node*, const K& key) const;
    Node* insert(Node*, const K& key);
    void traverse(Node*, void (*f)(const K&, const V&)) const;
};

#include "./CMap.cc"
#endif

CMap. cc (содержит реализацию)

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


// Default Constructor
template <typename K, typename V>
CMap<K,V>::CMap() {
    root = NULL;    
}

// Destructor
template <typename K, typename V>
CMap<K,V>::~CMap()  {
    deleteTree(root);
}


// delete
//in postOrder format

template <typename K, typename V>
void CMap<K,V>::deleteTree(Node* subNode) {
    if(subNode != NULL) {
        deleteTree(subNode -> leftPtr);
        deleteTree(subNode -> rightPtr);
        delete subNode;
        subNode = NULL;
    }
}


// [] operator overloading
template <typename K, typename V>
V& CMap<K,V>::operator [] (const K& nodeKey){
    Node* tempPtr;
    tempPtr = find(root, nodeKey);
    if(tempPtr != NULL) {
        return tempPtr -> value;
    }
    else {
        return insert(root, nodeKey) -> value;
    }
}


//find helper function
template <typename K, typename V>
typename CMap<K,V>::Node* CMap<K,V>::find(Node* subNode, const K& key) const {

    if(subNode == NULL)
        return NULL;
    if(subNode -> key == key)
        return subNode;
    else if(key < subNode -> key)
        return find(subNode -> leftPtr, key);
    else
        return find(subNode -> rightPtr, key);
}

//insert helper function
template <typename K, typename V>
typename CMap<K,V>::Node* CMap<K,V>::insert(Node* subNode, const K& key) {

    if(subNode == NULL) {
        subNode = new Node(key);
        return subNode;
    }
    else if(key < subNode -> key)
        return insert(subNode -> leftPtr, key);
    else
        return insert(subNode -> rightPtr, key);

}



// Traverse Public
template <typename K, typename V>
void CMap<K,V>::traverse(void(*f)(const K& key, const V& value)) const {
    traverse(root,f);
}

// Traverse Private
template <typename K, typename V>
void CMap<K,V>::traverse(Node* subNode, void(*f)(const K& key, const V& value)) const {
    if(subNode != NULL) {
        traverse(subNode -> leftPtr, f);
        f(subNode -> key, subNode -> value);
        traverse(subNode -> rightPtr, f);
    }
}

test. cc (содержит главная)

#include <iostream>
#include "./CMap.h"

using namespace std;

void readInput(CMap<string,int> &M);
void printEntry(const string& str, const int& val);
void printList(const CMap<string, int> &M);
void lower(char);

int main () {
    string s;
    CMap<string,int> M;
    M["word"]++;
    M.traverse(printEntry);
    //printList(M);
    cout << "end of main" << endl;
    return 0;

}

void readInput(CMap<string, int> &M) {
    string s;
    cout <<"Enter the word: " << endl;
    while(cin >> s) {
        M[s]++;
        cout << "Enter the word: " << endl;
    }

}

void printList(const CMap<string, int> &M) {
    M.traverse(printEntry);
}

void printEntry(const string& str, const int& val) {
    cout << str << "::" << val << endl;
}
...