template <class T>
void BinaryTree<T>::LoadTree(const char *file)
{
ifstream fin;
fin.open(file);
string buffer;
T buff;
while (!fin.eof())
{
getline(fin,buffer,'~');
fin>>buff;
TreeNode<T> *temp,*temp1;
temp=Root;
temp1=temp;
while (temp!=NULL)
{
temp1=temp;
TreeNode<T> *Right=temp->RightChild;
TreeNode<T> *Left=temp->LeftChild;
if (temp->key>buff)
{
temp=temp->LeftChild;
}
else if (temp->key<buff)
{
temp=temp->RightChild;
}
}
temp=new TreeNode<T>(buff,buffer);
if (temp!=Root)
temp->Parent=temp1;
}
fin.close();
}
我正在创建一个二进制搜索树。这是我的一段代码,我输入的文件包含一个名称和一个像“Alex~231423”这样的密钥。我的代码是正确的BST,因为当我运行它有一个msg,上面写着“这个应用程序已经请求Runtime以一种不寻常的方式终止它。请联系应用程序的支持团队以获取更多信息。”我真的不明白什么是错的。我将不胜感激任何帮助 ** *上一个问题已解决,但msg出现在insertNode函数中,如下所示:
template <class T>
void BinaryTree<T>::insertNode(T Key,string Val)
{
TreeNode<T> *temp,*temp1;
temp=Root;
while (temp!=NULL)
{
temp1=temp;
if (temp->key>Key)
{
temp=temp->LeftChild;
}
else if (temp->key<Key)
{
temp=temp->RightChild;
}
}
temp=new TreeNode<T>(Key,Val);
temp->Parent=temp1;
}
这是TreeNode部分
template <class T>
struct TreeNode{
string value;
T key;
TreeNode<T> *Parent;
TreeNode<T> *LeftChild;
TreeNode<T> *RightChild;
TreeNode (T k,string Val)
{
this->value=Val;
this->key=k;
this->Parent=NULL;
this->LeftChild=NULL;
this->RightChild=NULL;
}
};
Actually I was getting the error for search function,not insert function.I am sorry for inconvenience.here is the code
template <class T>
string BinaryTree<T>::searchNode(T Key)
{
TreeNode<T> *temp=Root;
while (temp!=NULL)
{
if (temp->key==Key)
{
return temp->value;
}
if (temp->key>Key)
{
temp=temp->LeftChild;
}
else if (temp->key<Key)
{
temp=temp->RightChild;
}
}
return NULL;
}
答案 0 :(得分:1)
不确定这是否是 问题,但需要指向指针的指针,否则您只需修改本地变量,而不是左/右子成员。
TreeNode<T> **temp = &Root,
*temp1 = NULL; // otherwise Root will have an invalid parent pointer
while (*temp != NULL)
{
temp1 = *temp;
if (temp1->key > Key)
{
temp = &(*temp)->LeftChild;
}
else if (temp1->key < Key)
{
temp = &(*temp)->RightChild;
}
}
*temp = new TreeNode<T>(Key,Val);
(*temp)->Parent = temp1;
答案 1 :(得分:0)
IMO,你忘记了插入等式条件:
if (temp->key > key)
{
temp=temp->LeftChild;
}
else if (temp->key < key)
{
temp=temp->RightChild;
}
else // if (temp->key == key)
{
// Do something (e.g break loop)
}
答案 2 :(得分:0)
您需要进行更多初始化(Root和子):
template <class T>
void BinaryTree<T>::LoadTree(const char *file)
{
ifstream fin(file);
string buffer;
T buff;
while (getline(fin,buffer,'~') && fin>>buff )
{
TreeNode<T> *temp,*temp1;
temp=Root;
temp1=temp;
while (temp!=NULL)
{
temp1=temp;
TreeNode<T> *Right=temp->RightChild;
TreeNode<T> *Left =temp->LeftChild;
if (temp->key >= buff) { temp=temp->LeftChild; }
else if (temp->key < buff) { temp=temp->RightChild; }
} // allow duplicate key??
temp=new TreeNode<T>(buff,buffer);
if ( !Root) { Root=temp; continue; }
//else if (temp !=Root) temp->Parent=temp1;
// insert the new node in the correct branch, that was NULL
if (temp1->key >= buff)
{
temp1->LeftChild=temp;
}
else temp1->RightChild=temp;
}
fin.close();
}
另外,失败时,你的searchNode必须返回“”??但不是NULL。
答案 3 :(得分:0)
您写这个的方式意味着您只能从文件创建它。写operator>>
以使用istream
。它也会使测试更容易:
template <class T>
class BinaryTree {
public:
istream& operator>>(istream& is) {
//...
return is;
}
};
int main() {
stringstream ss("tree formatted data");
BinaryTree<int> tree;
ss >> tree;
return 0;
}
将"tree formatted data"
替换为您的数据。