1

我正在开发一个函数,该函数在 C 中的二叉搜索树中搜索随函数传入的名称。但是,我坚持如何格式化我的循环,以便当遍历到达没有子节点的最左侧节点时,recusion 不会简单地结束。遍历必须是预定的(访问我自己,然后是我的左孩子,然后是我的右孩子)。

我的查找功能如下:

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。有任何想法吗?

4

3 回答 3

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;
于 2013-05-17T02:09:40.027 回答
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)
}
于 2013-05-17T06:19:25.050 回答
0
// get the matching pointer for left or right subtree, and return 

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;
    }

    tnode * ptrtemp = bst_find_by_name(ptr->left, nom);
    if(!ptrtemp) {
        ptrtemp = bst_find_by_name(ptr->right, nom);
    } 
    return  ptrtemp;
} 
于 2017-05-08T16:42:30.717 回答