【问题标题】:C Binary Search Tree pre-order traversal with recursionC二叉搜索树前序遍历与递归
【发布时间】:2013-05-12 02:36:18
【问题描述】:

我正在开发一个函数,该函数在 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。有什么想法吗?

【问题讨论】:

    标签: c binary-search-tree


    【解决方案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;
    

    【讨论】:

    • 就是这么简单。我不知道为什么没有来找我。也许经过数小时的编码后,您开始体验到大脑所能想出的收益递减。非常感谢!
    • 如果@FDinoff的回答对你有用,你可以点击对勾接受
    • 如果你传入一个空树(ptr == NULL),这会崩溃,在大多数情况下这应该被认为是有效的输入。请参阅我的答案以获得更清洁的解决方案(在我看来)
    • @xaxxon 我发布的代码中没有对 ptr 进行 NULL 检查,因为我认为 OP 会像他在原始函数中那样进行正确的 NULL 检查。
    【解决方案2】:

    我更喜欢这样写:

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

    【讨论】:

    • 这不起作用,因为逻辑或返回 0 或 1。不是指向 tnode 的指针。
    【解决方案3】:
    // 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;
    } 
    

    【讨论】:

      猜你喜欢
      • 2020-09-25
      • 1970-01-01
      • 1970-01-01
      • 2014-03-29
      • 2021-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多