我開始時提供了所有我認爲相關的代碼。基本上二進制搜索樹已經定義了,我們需要添加一個父節點功能。我已經這樣做了,但是我不斷收到分段錯誤。創建二進制搜索樹時出現分段錯誤問題
template <class TKey>
class bst {
private:
struct node {
node() { key=TKey(); link[0]=link[1]=NULL; parent=NULL; }
operator TKey() { return key; }
void print();
TKey key;
node *link[2];
node *parent;
};
public:
class iterator {
public:
private:
friend class bst<TKey>;
node *p;
};
node *prev_node;
iterator begin() { }
iterator end() { }
bst() { Troot=NULL; }
~bst() { clear(Troot); }
bool empty() { return Troot==NULL; }
void clear() { clear(Troot); Troot=NULL; }
void erase(TKey &key);
void insert(TKey &key);
void print_inorder() { print_inorder(Troot); }
void print_bylevel();
private:
void clear(node *);
node *minmax_key(node *, int);
node *erase(node *, TKey &);
node *insert(node *, TKey &);
void print_inorder(node *);
node *Troot;
};
那就是類定義。
template <class TKey>
void bst<TKey>::insert(TKey &key)
{
Troot = insert(Troot, key);
}
template <class TKey>
class bst<TKey>::node *bst<TKey>::insert(node *T, TKey &key)
{
cout << "insert1" << endl;
if (T == NULL) {
T = new node;
T->key = key;
if (prev_node != NULL)
T->parent = prev_node;
cout << T->parent->key;
} else if (T->key == key) {
cout << "key " << key << " already in tree" << endl;
} else {
prev_node = T;
int dir = T->key < key;
T->link[dir] = insert(T->link[dir], key);
}
return T;
}
這些是插入功能。我猜我正在做一些亂七八糟的事情,因爲我仍然很生疏,遞歸。當我運行使用該樹的測試程序時,它會輸出inser1行,但會發出seg故障。所以我知道這是搞亂了第一次插入。任何幫助?如果您需要查看代碼的其餘部分,我可以把它放在一起,但它會有很多與我所做的更改無關的東西。
爲什麼不使用如GDB或LLDB調試器? –