Я работаю над заданием, в котором я должен создать шаблонный класс 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;
}