C中二叉查找树为空的困惑

6pp0gazn  于 2023-05-28  发布在  其他
关注(0)|答案(1)|浏览(139)

我想定义一个函数,使二叉查找树为空,返回类型为void。
下面是我的代码:
_Node structure

typedef struct _Node {
    int data;
    struct _Node* l_child;
    struct _Node* r_child;
} Node;

BST_To_Empty

void BST_To_Empty(Node* root)
{
    if(root)
    {
        BST_To_Empty(root->l_child);
        BST_To_Empty(root->r_child);
        free(root);
    }
    printf("[BST_To_Empty] Now BST is NULL");
}

CheckEmpty

void isEmpty(Node* root)
{
    if (root == NULL)
    {
        printf("NULL");
    }
    else
    {
        printf("Not NULL");
    }
}

用这些代码我做了如下的主要功能:

int main()
{
    Node* root = NULL;
    // Some Initialization
    BST_To_Empty(root);
    CheckEmpty(root);
}

所以我想我可以得到一个结果“[BST_To_Empty] Now BST is NULL”和“NULL”
但是我得到了“[BST_To_Empty] Now BST is NULL”和“Not NULL”
我有一点困惑,为什么“CheckEmpty”的结果是“Not NULL”,尽管我让root自由?
我应该修改什么才能得到“CheckEmpty”的结果是“NULL”?
谢谢你的帮助

jgovgodb

jgovgodb1#

函数BST_To_Empty声明如下

void BST_To_Empty(Node* root)

处理main中声明的指针root的值的副本

Node* root = NULL;
BST_To_Empty(root);

在函数内更改原始指针的值的副本会使原始指针保持不变。此外,函数free也通过值接受指针,并且不将原始指针设置为NULL
需要通过引用将原始指针root传递给函数。
在C中,通过引用传递对象意味着通过指向它的指针间接传递它。
这就是函数的样子

void BST_To_Empty(Node **root )
{
    if( *root )
    {
        BST_To_Empty( &( *root )->l_child );
        BST_To_Empty( &( *root )->r_child );
        free( *root );
        *root = NULL;
    }
}

被称为

BST_To_Empty( &root );

反过来,函数isEmpty应该像这样声明和定义

int isEmpty( const Node *root )
{
    return root == NULL:
}

并且函数不应显示任何消息。函数的调用者将决定是否输出消息,例如

if ( isEmpty( root ) )
{
    puts("NULL");
}
else
{
    puts("Not NULL");
}

相关问题