所以我已经为我的Tree中的Value提供了这个Insert函数如何将它转换为这种类型的void函数?
void InsertValue(Node* root, int value){
这是我的正常功能:
Node* Insert(Node* root,int value) {
if(root == NULL) { // empty tree
root = CreateNode(value);
}
// if data to be inserted is lesser, insert in left subtree.
else if(value <= root->value) {
root->left = Insert(root->left,value);
}
// else, insert in right subtree.
else {
root->right = Insert(root->right,value);
}
return root;
}
感谢您的帮助
答案 0 :(得分:2)
你可以做以下两件事之一:
root
指向指针。这可以很好地工作,但语法可能有点尴尬,要求您在使用前取消引用root
。所以选项#2就是。怎么做?只需将其功能更改为接受root
作为指针的引用。
void InsertNode(Node*& root, int value)
{
// your existing code!
}
答案 1 :(得分:1)
如果没有返回值保留传递回调用者的可能添加的新节点,则必须以某种方式返回潜在的插入节点 。如果需要void
结果类型,则需要按地址(Node **
)或引用(Node *&
)传递目标指针。鉴于这是标记的C ++,我使用后者。
void Insert(Node*& root, int value)
{
if(root == NULL)
root = CreateNode(value);
else if(value <= root->value)
Insert(root->left,value);
else
Insert(root->right,value);
}
请注意,这始终会在节点的 left 侧挂起重复项。要在右侧挂起重复项,请更改此项:
else if(value <= root->value)
Insert(root->left,value);
到此:
else if(value < root->value)
Insert(root->left,value);
最后,如果您想在树中使用唯一键(即忽略重复项),则以下操作会执行此操作:
void Insert(Node*& root, int value)
{
if(root == NULL)
root = CreateNode(value);
else if (value < root->value)
Insert(root->left,value);
else if (root->value < value)
Insert(root->right, value);
// else key is already present; do nothing.
}
这假设一个strict weak ordering个键值,它具有以下属性:
if (!(a<b || b<a))
then a == b
祝你好运。