我有一个方法可以将节点插入到二叉树中,该树使用指向指针的指针在树中正确分配新节点。
由于我正在使用C ++,我认为可以将此指针更改为指向指针的指针,从而产生更清晰的C ++代码。但是如何做到这一点并保持分配正确?
bool insert(T value) {
node** buff = &root;
while ((*buff) != NULL) {
if (value == (*buff)->value) {
return false;
} else if (value < (*buff)->value) {
buff = &(*buff)->left;
} else {
buff = &(*buff)->right;
}
}
*buff = new node(value);
return true;
}
答案 0 :(得分:2)
未经测试,但这是个主意:你在父母时插入,而不是在你下降为null时插入:
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;
}
答案 1 :(得分:0)
您无法重新分配参考,因此buff = &(*buff)->left;
,
您无法将node** buff = &root;
更改为node*& buff = root;
(并将(*buff)
替换为buff
)。