我正在研究一个函数,该函数在C中搜索二进制搜索树,查找随函数传入的名称。但是,我仍然坚持如何格式化我的循环,以便当遍历到达没有子节点的最左边节点时,重复不会简单地结束。遍历必须是预先订购(访问我自己,然后是我的左孩子,然后是我的右孩子)。
我的查找功能如下:
tnode *bst_find_by_name(tnode *ptr, const char *nom){
if(ptr != NULL){
if(strcmp(ptr->name, nom) == 0){
return ptr;
}
if(ptr->left != NULL){
return bst_find_by_name(ptr->left, nom);
}
if(ptr->right != NULL){
return bst_find_by_name(ptr->right, nom);
}
}
return NULL;
}
正如您所看到的,当前它只是在到达最左侧节点时返回NULL,该节点与传递给函数的字符串不匹配。如果它在树中找不到匹配项,我必须返回NULL,但同时我不希望它在有机会搜索树中的每个节点之前过早返回NULL。有什么想法吗?
答案 0 :(得分:1)
创建一个包含返回值的临时变量。并检查bst_find_by_name
是否返回NULL以外的其他内容,如果返回NULL,则继续检查树。
如下所示。
tnode *ret = NULL;
if(ptr->left != NULL){
ret = bst_find_by_name(ptr->left, nom);
}
if(ret == NULL && ptr->right != NULL){
ret = bst_find_by_name(ptr->right, nom);
}
return ret;
答案 1 :(得分:1)
我更喜欢这样写:
tnode *bst_find_by_name(tnode *ptr, const char *nom) {
// accept a null node, just exit early before dereferencing it
if (ptr == NULL) {
return NULL;
}
// is it this node?
if(strcmp(ptr->name, nom) == 0){
return ptr;
}
// remember, if the first part is true, || will skip the second part
return bst_find_by_name(ptr->left, nom) || bst_find_by_name(ptr->right, nom)
}
答案 2 :(得分:0)
level1