我正在尝试实现二叉搜索树类。 这是代码(标题):
template <typename Data>
class BST
{
public:
BST();
void Insert(Data _item);
//~BST(); TODO
struct Node
{
Node()
{m_left = m_right = 0;}
Data m_data;
Node* m_left;
Node* m_right;
};
Node* m_root;
private:
void RecInsert(Node* _root, Data _item);
Node* CreateNode(Data _item);
};
template <typename Data>
BST<Data>::BST()
: m_root(0)
{
}
template <typename Data>
void BST<Data>::Insert(Data _item)
{
RecInsert(m_root, _item);
}
template <typename Data>
void BST<Data>::RecInsert(Node* _root, Data _item)
{
if (NULL == _root)
{
_root = CreateNode(_item);
return;
}
if(_item < _root->m_data)
{
RecInsert(_root->m_left, _item);
}
else
{
RecInsert(_root->m_right, _item);
}
}
template <typename Data>
typename BST<Data>::Node* BST<Data>::CreateNode(Data _item)
{
Node* newNode = new Node();
newNode->m_data = _item;
newNode->m_left = newNode->m_right = 0;
return newNode;
}
所以基本上我的类保存Node *,它在构造函数中初始化为null,每次插入元素时,都会分配一个新节点。但似乎我做错了什么。这是我的考验:
#include <iostream>
#include "bst.h"
using namespace std;
int main()
{
BST<int> tree;
tree.Insert(4);
tree.Insert(11);
tree.Insert(1);
cout << tree.m_root->m_data << "\t"; //segmentation fault!!
cout << tree.m_root->m_left->m_data << "\t";
cout << tree.m_root->m_right->m_data << "\t";
}
我遇到了分段错误(请参阅代码中的注释)。 在调试时我看到每次调用insert函数时m_root数据成员都是NULL,尽管在第一次插入之后它不应该为null。所以插入内容不正确。
由于
答案 0 :(得分:5)
在调试时我看到每次调用insert函数时m_root数据成员都是NULL,尽管在第一次插入之后它不应该为null。所以插入内容不正确。
RecInsert
的第一个参数需要是对Node*
的引用。否则,函数中对_root
的任何更改都只是本地更改。
声明
void RecInsert(Node*& _root, Data _item);
// ^^^
定义
template <typename Data>
void BST<Data>::RecInsert(Node*& _root, Data _item)
// ^^^
{
...
}