C-使用后序遍历释放二叉树的内存
我想使用后序遍历删除二叉树。这意味着应该先删除树的左侧部分,然后删除右侧部分,然后删除整个树并在随后的第二个函数中释放内存。我不允许更改函数的参数,只能使用函数的内部:C-使用后序遍历释放二叉树的内存,c,algorithm,recursion,tree,binary-search-tree,C,Algorithm,Recursion,Tree,Binary Search Tree,我想使用后序遍历删除二叉树。这意味着应该先删除树的左侧部分,然后删除右侧部分,然后删除整个树并在随后的第二个函数中释放内存。我不允许更改函数的参数,只能使用函数的内部: #include <stdio.h> #include <stdlib.h> #include <string.h> #include "telefonbuch.h" static inline bstree * create_node(unsigned long phone, char *
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "telefonbuch.h"
static inline bstree * create_node(unsigned long phone, char * name)
{
bstree * newNode = (bstree *) malloc(sizeof(bstree));
newNode->key.phone = phone;
strcpy(newNode->key.name, name);
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
void bst_insert_node(bstree * bst, unsigned long phone, char * name)
{
if (bst == NULL)
{
return;
}
if (bst->key.phone > phone)
{
if (bst->left == NULL)
{
bst->left = create_node(phone, name);
return;
}
bst_insert_node(bst->left, phone, name);
}
else
{
if (bst->right == NULL)
{
bst->right = create_node(phone, name);
return;
}
bst_insert_node(bst->right, phone, name);
}
}
bst_node * find_node(bstree* bst, unsigned long phone) {
if (bst == NULL)
{
return NULL;
}
if(bst->key.phone > phone)
{
return find_node(bst->left, phone);
}
else if (bst->key.phone < phone)
{
return find_node(bst->right, phone);
}
return &(bst->key);
}
void bst_in_order_walk_node(bst_node* node) {
}
void bst_in_order_walk(bstree* bst) {
int temp = 0;
int level;
while(temp < level)
{
printf("-");
++temp;
}
printf(" (%ld-%s)\n", bst->key.phone, bst->key.name);
if (bst->left != NULL)
{
print_tree(bst->left, level + 1);
}
if (bst->right != NULL)
{
print_tree(bst->right, level + 1);
}
}
void bst_free_subtree(bst_node* node) {
…what goes here?…
}
void bst_free_tree(bstree* bst) {
if(bst==NULL)
return;
bst_free_tree(bst->left);
printf("Deleting %d node.\n",bst->key);
free(bst);
bst_free_tree(bst->right);
}
您能帮我完成/更正代码吗?您有:
void bst_free_tree(bstree* bst) {
if(bst==NULL)
return;
bst_free_tree(bst->left);
printf("Deleting %d node.\n",bst->key);
free(bst);
bst_free_tree(bst->right);
}
这将“按顺序”删除当前节点,并在释放后访问释放的内存。不好
你需要一个亲密的关系:
void bst_free_tree(bstree* bst)
{
if (bst == NULL)
return;
bst_free_tree(bst->left);
bst_free_tree(bst->right);
printf("Deleting %d node.\n", bst->key);
free(bst);
}
这将遍历并释放左子树,然后是右子树,最后释放当前节点
我认为没有必要使用
bst\u free\u子树()
函数;bst\u free\u tree()
函数同样可以很好地释放子树。我不明白bst\u free\u子树
应该做什么。它的参数是一个节点,所以不能用它释放整个子树。顺便说一句,您的函数bst\u free\u tree
部分错误,因为bst->right
是在bst
被释放后使用的。您必须在通话后移动语句free(bst)
。嘿,艾哈迈德,我也遇到了问题,您确定free_子树的签名有效吗?你能把所有功能的签名都贴出来吗?我可以帮你解决这个问题:)在我看来,bst\u free\u树
独立完成了整个工作。您需要什么bst\u free\u子树
?(如果bstree
struct的定义包含bst\u节点*键;
而不是bst\u节点键;
,情况就不同了)我发布了整个程序:)
void bst_free_tree(bstree* bst)
{
if (bst == NULL)
return;
bst_free_tree(bst->left);
bst_free_tree(bst->right);
printf("Deleting %d node.\n", bst->key);
free(bst);
}