C 我很确定递归函数中存在内存泄漏,但我不知道';我不知道如何修理它

C 我很确定递归函数中存在内存泄漏,但我不知道';我不知道如何修理它,c,recursion,memory-leaks,malloc,C,Recursion,Memory Leaks,Malloc,我正在二叉树上运行一个搜索函数,该函数将返回一个二叉树,返回的树的根是搜索查询,例如,如果我有: 100为根 50岁和150岁作为子女 20岁、70岁和50岁的孩子--&--120岁和170岁的孩子是150岁的孩子 如果我把50作为搜索函数的键,它将返回一个二叉树,50作为根,20和70作为子树。这一切都是用指针完成的。我的问题是,每次递归调用我都会调用一个新的BST(二进制搜索树)结构,而不是释放它,所以我几乎可以肯定我有内存泄漏,但我不知道如何在使用之前不释放内存来修复它。下面是我的功能 t

我正在二叉树上运行一个搜索函数,该函数将返回一个二叉树,返回的树的根是搜索查询,例如,如果我有:

100为根

50岁和150岁作为子女

20岁、70岁和50岁的孩子--&--120岁和170岁的孩子是150岁的孩子

如果我把50作为搜索函数的键,它将返回一个二叉树,50作为根,20和70作为子树。这一切都是用指针完成的。我的问题是,每次递归调用我都会调用一个新的BST(二进制搜索树)结构,而不是释放它,所以我几乎可以肯定我有内存泄漏,但我不知道如何在使用之前不释放内存来修复它。下面是我的功能

typedef struct node { 
    int key; 
    struct node *left, *right; 
} Node; 

typedef struct binarySearchTree {
    Node* top;
} BST;

BST *search(BST* bst, int key) {
    // Base Cases: root is null or key is present at root 
    if (bst->top == NULL || bst->top->key == key) {
        return bst;
    }

    // Key is greater than root's key 
    if (bst->top->key < key) {
        BST *temp = malloc(sizeof(BST));
        temp->top = bst->top->right;
        return search(temp, key); 
    }

    // Key is smaller than root's key 
    BST *temp = malloc(sizeof(BST));
    temp->top = bst->top->left;
    return search(temp, key); 
} 
typedef结构节点{
int键;
结构节点*左、*右;
}节点;
typedef结构二进制搜索树{
节点*顶部;
}英国理工学院;
BST*搜索(BST*BST,整数键){
//基本情况:根为空或根中存在键
如果(bst->top==NULL | | bst->top->key==key){
返回bst;
}
//键大于根的键
如果(bst->top->key顶部=bst->顶部->右侧;
返回搜索(临时、密钥);
}
//密钥小于root的密钥
BST*temp=malloc(sizeof(BST));
温度->顶部=bst->顶部->左侧;
返回搜索(临时、密钥);
} 

任何想法都将不胜感激。谢谢

无需为搜索功能分配内存。问题似乎在于,您正在传递一个
BST
对象,而您应该传递一个
节点
对象

Node* search(Node* node, int key){ 
    if (node== NULL) return NULL;

    if (node->key < key) {
        return search(node->left, key); 
    } else if (node->key > key){
        return search(node->right, key); 
    } else {
        return node;
    }
}
Node*搜索(Node*Node,int键){
如果(node==NULL)返回NULL;
如果(节点->键<键){
返回搜索(节点->左,键);
}else if(节点->键>键){
返回搜索(节点->右侧,键);
}否则{
返回节点;
}
}

现在,该函数将返回包含该键的节点,如果未找到,则返回NULL。

无需为搜索函数分配内存。问题似乎在于,您正在传递一个
BST
对象,而您应该传递一个
节点
对象

Node* search(Node* node, int key){ 
    if (node== NULL) return NULL;

    if (node->key < key) {
        return search(node->left, key); 
    } else if (node->key > key){
        return search(node->right, key); 
    } else {
        return node;
    }
}
Node*搜索(Node*Node,int键){
如果(node==NULL)返回NULL;
如果(节点->键<键){
返回搜索(节点->左,键);
}else if(节点->键>键){
返回搜索(节点->右侧,键);
}否则{
返回节点;
}
}

现在,函数将返回包含键的节点,如果找不到,则返回
NULL

为什么要在搜索函数中使用
malloc
?它不应该创建任何新数据。只需使用
返回搜索(bst->top->right,key)
,左键也是如此。为什么要在搜索函数中使用
malloc
?它不应该创建任何新数据。只需使用
返回搜索(bst->top->right,key)
,左侧也是如此。是的,这是正确的,但要求搜索功能可以接收bst作为输入,是否最好在另一个函数中使用该搜索函数,该函数的唯一目的是接收BST,然后将其根传递给您推荐的搜索函数?@AdamMenker是的,您将创建一个包装函数,该函数接收
BST
,并将根节点传递给递归搜索函数。是的,这是真的,但有一个要求是搜索函数可以接收BST作为输入,最好在另一个函数中使用该搜索函数,该函数的唯一目的是接收BST,然后将其根传递给您推荐的搜索函数?@AdamMenker Yes,您将创建一个包装函数,它接受
BST
,并将根节点传递给递归搜索函数。