我試圖在C++中使用模板實現泛型BST。 不過, 當我用gdb調試它的時候。我發現,每當我調用InsertNode, 它將t視爲NULL。 當我遍歷insertFunction時,它正確運行。 使用模板時是否有任何樹聲明的問題。在C++中用模板構建BST
//
// main.cpp
// c++_project
//
// Created by Timothy Leung on 5/5/13.
// Copyright 2013 __MyCompanyName__. All rights reserved.
//
#include <iostream>
using namespace std;
template <typename data_t>
struct nodeT{
data_t data;
nodeT *left, *right;
};
template <typename data_t>
nodeT<data_t> *FindNode(nodeT<data_t> *t, data_t data);
template <typename data_t>
void InsertNode(nodeT<data_t> *t, data_t data);
template <typename data_t>
void display_tree(nodeT<data_t> *t);
int main (int argc, const char * argv[])
{
cout << "Welcome to my BST! " << endl;
nodeT<int> *tree;
cout << "How many items do you have? \n";
int num, temp;
cin >> num;
for (int i=0; i<num; ++i) {
cout << "Number please :) \n";
cin >> temp;
InsertNode(tree, temp);
}
cout << "In order treeeeeee \n"<<endl;
display_tree(tree);
}
template <typename data_t>
nodeT<data_t> *FindNode(nodeT<data_t> *t, data_t data){
if(t==NULL) return NULL;
if(data==t->data) return t;
if (data < t->data) {
FindNode(t->left, data);
} else
FindNode(t->right, data);
}
template <typename data_t>
void InsertNode(nodeT<data_t> *t, data_t data){
if(t==NULL){
t = new nodeT<data_t>;
t->data = data;
t->left = NULL;
t->right = NULL;
return;
}
if(t->data < data){
InsertNode(t->right, data);
} else
InsertNode(t->left, data);
}
template <typename data_t>
void display_tree(nodeT<data_t> *t){
if (t!=NULL) {
display_tree(t->left);
cout << t->data << endl;
display_tree(t->right);
}
}
你..你是對的。更正void InsertNode(nodeT *&t,data_t data); –
2013-05-05 00:58:27
但我不明白。我將t作爲指針傳遞,所以當我在插入節點中修改它時,是否也應該修改它? – 2013-05-05 01:05:30
哦,我明白了。如果我通過nodeT * t,它是指針的副本。當我調用新的NodeT時,它會用新地址覆蓋* t,所以原始指針nvr在NULL時改變了 –
2013-05-05 01:20:04