没有测试,但是这是想法:你插入的时候你是在父母,而不是当你陷入空:
bool insert(T value) {
if (root == nullptr) {
root = new node(value);
return true;
}
node* buff = root;
while(buff->value != value) {
if (value < buff->value) {
if(buff->left == nullptr {
buff->left = new node(value);
return true;
}
buff = buff->left;
} else {
if (buff->right == nullptr) {
buff->right = new node(value);
return true;
}
buff = buff->right;
}
}
return false;
}
我怎么会写:
// returns the node under which the insertion must be done
// or nullptr if the value already exists in the tree
// prereq: tree must be not empty
node* findParentInsertionPoint(T value) {
if (root == nullptr) {
throw std::logic_erro("");
}
node* n = root;
while(n->value != value) {
if (value < n->value) {
if(n->left == nullptr {
return buff;
}
n= n->left;
} else {
if (n->right == nullptr) {
return n;
}
n= n->right;
}
}
return nullptr;
}
// inserts a leaf as child of parent
// prereq: parent must be not null
// the corresponding child must be null;
void insertLeafAt(T value, node * parent) {
if (parent == nullptr) {
throw std::logic_error("");
}
if (value < parent->value) {
parent->left = new node(value);
} else {
parent->right = new node(value);
}
}
bool insert(T value) {
if (root == nullptr) {
root = new node(value);
return true;
}
node* parent = findParentInsertionPoint(value);
if (parent == nulptr) {
return false;
}
insertLeafAt(T value, parent);
return true;
}
我不看看你为什么需要双指针。只要放下一个间接。 – bolov
我不太清楚,但是当我使用单个指针时,似乎我的分配是在未定义的位置完成的,就像我的根始终指向NULL一样,无论在树中插入元素。 – aajjbb