我有一个将一个节点插入到二叉树中的方法,它使用指向指针的指针来正确分配树中的新节点。
在使用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;
}发布于 2014-07-09 21:16:07
没有测试,但这是一个想法:当您在父级时插入,而不是当您降至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;
}发布于 2014-07-09 20:21:02
您不能重新分配引用,因此由于buff = &(*buff)->left;,
不能将node** buff = &root;更改为node*& buff = root; (并将(*buff)替换为buff)。
https://stackoverflow.com/questions/24662862
复制相似问题