Я работаю над программой двоичного дерева, и при вызове моей функции вставки она, кажется, вставляет введенное значение, и, проверяя это значение, я ничего не получаю и не теряю прямо сейчас, что я могу потерять или что может быть неправильным? Я предоставил данные класса и определения функции вставки/поиска ниже, у меня просто странное чувство, что это связано с моей реализацией шаблонов или просто шаблонами в общей помощи?
struct node
{
string keyValue; //value to stored that is being searched for in our tree
node *left; //left side of pointing tree from parent node
node *right; //right side of pointing tree from parent node
};
template <class T>
class Tree
{
public:
Tree(); //constructor
~Tree(); //destructor
void displayTree();
void insertTree(T key);
node *searchTree(T key);
void deleteTree();
private:
node *root; //points to the root point of our tree
void displayTree(node *leaf);
void insertTree(T key, node *leaf); //takes in our keyValue to
void deleteTree(node*leaf);
node *search(T key, node *leaf);
};
template <class T>
void Tree<T>::insertTree(T key)
{
cout << "instert1" << endl;
if(root != NULL)
{
cout << "instert2" << endl;
insertTree(key, root);
}
else
{
cout << "inster else..." << endl;
root = new node;
root->keyValue = key;
cout << root->keyValue << "--root key value" << endl;
root->left = NULL;
root->right = NULL;
}
}
template <class T>
void Tree<T>::insertTree(T key, node *leaf)
{
if(key < leaf->keyValue)
{
if(leaf->left != NULL)
{
insertTree(key, leaf->left);
}
else //descend tree to find appropriate NULL node to store keyValue (left side of tree)
{
leaf->left = new node; //Creating new node to store our keyValue (data)
leaf->left -> keyValue = key;
leaf->left -> left = NULL; //Assigning left and right child of current child node to NULL
leaf->left -> right = NULL;
}
}
else if(key >= leaf->keyValue)
{
if(leaf->right != NULL)
{
insertTree(key, leaf->right);
}
else //descend tree to find appropriate NULL node to store keyValue (right side of tree)
{
leaf->right = new node; //Creating new node to store our keyValue (data)
leaf->right -> keyValue = key;
leaf->right -> right = NULL; //Assigning left and right child of current child node to NULL
leaf->right -> left = NULL;
}
}
}
template <class T>
node *Tree<T>::searchTree(T key)
{
cout << "searching for...key: " << key << " and given root value:" << endl;
return search(key, root);
}
template <class T>
node *Tree<T>::search(T key, node*leaf)
{
if(leaf != NULL)
{
cout << "check passed for search!" << endl;
if(key == leaf->keyValue)
{
return leaf;
}
if(key < leaf->keyValue)
{
return search(key, leaf->left);
}
else
{
return search(key, leaf->right);
}
}
else
{
cout << key << " Not found...!" << endl;
return NULL;
}
}
Кажется, что ваш код работает. Вы можете посмотреть здесь: http://ideone.com/w9Aa1w
То, что вам может понадобиться сделать, что я и сделал, - это templatize структуру узла, например...
template <typename T>
struct NodeStruct
{
T keyValue; //value to stored that is being searched for in our tree
NodeStruct<T> *left; //left side of pointing tree from parent node
NodeStruct<T> *right; //right side of pointing tree from parent node
};
Затем в вашем дереве class typedef ваш новый тип узла как "узел":
typedef NodeStruct<T> node;
Тем не менее, казалось, что он правильно вставлен.
В будущем это поможет, если вы будете более ясны с конкретной проблемой, с которой вы сталкиваетесь, и вместо того, чтобы просто публиковать целую программу, определите хотя бы подраздел кода, с которым вы столкнулись.
Этот вопрос слишком расплывчатый и, вероятно, не будет полезен никому другому как справочный материал.