我正在编码插入C中的BST。当我遍历树时,第一个片段似乎无效。我不明白为什么它不起作用。 这不起作用:
void insert(Node* temp, int data)
{
if(temp==NULL)
temp=Newnode(data);
else if(data<temp->data)
insert(temp->left,data);
else if(data>temp->data)
insert(temp->right,data);
}
这有效:
Node* insert(Node* temp, int data)
{
if(data<temp->data)
if(temp->left!=NULL) insert(temp->left,data);
else temp->left= Newnode(data);
else if(data>temp->data)
if(temp->right!=NULL) insert(temp->right,data);
else temp->right= Newnode(data);
}
注意:我使用了#define Node struct node。 Newnode()分配一个新节点并且工作正常。
答案 0 :(得分:0)
看看以NULL
作为根值传递时会发生什么:
temp
正在分配一个新的节点实例。但是,赋值仅在insert()
本地,因此在调用返回后,赋值已“消失”。
您可能希望将插入方法签名更改为
void insert(Node **temp, data)
并使用
*temp = Newnode(data);
使它像你期望的那样工作。
答案 1 :(得分:0)
严格来说,第二种方式也不正确。对于您发布的两种方式:
以下是两个版本:
def cached_coroutine(f):
@gen.coroutine
def wrapped(*args):
if args in cache:
return cache[args]
result = yield f(*args)
cache[args] = f
return result
return wrapped
这个通过双指针来解决上述问题。
void insert(node **curr, int val) {
if(!(*curr)) {
*curr = Newnode(val);
return;
}
if(val < (*curr)->data) {
insert(&(*curr)->left, val);
} else if(val > (*curr)->data) {
insert(&(*curr)->right, val);
}
}
insert(&root, val);
这个使用return val赋值作为解决方案。