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