[英]Building BST in c++ with template
我正在尝试使用c ++中的模板来实现通用BST。 但是,当我使用gdb调试它时。 我发现每当我调用InsertNode时,它将t视为NULL。 当我逐步执行insertFunction时,它可以正常运行。 使用模板时树的声明有什么问题吗?
//
// 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);
}
}
InsertNode(tree, temp);
按值传递tree
,这意味着您所做的更改是设置为相同值的tree
的副本。 同样的原因是,如果要在函数中更改data
,则不会更改temp
。
您可能需要更改InsertNode
以获取引用或双指针(因此您按引用/地址传递,以便使对节点的更改显而易见),或更改InsertNode
以返回新创建的节点(并将其分配给tree
(但是确保您只在第一次分配它))。
调用insertNode(t-> right和t-> left ...)时,right和left始终为null。 您应该首先为它们创建一个实例,如下所示:
t->right = new nodeT<data_t>;
insertNode(t->right,data);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.