我想定义一个函数,使二叉搜索树为空,返回类型为VALID.

以下是我的代码:

_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]现在BST为空"和 "空"

但我有 "[BST_TO_EMPTY]现在BST为空"和 "非空"

我有点困惑,为什么"CheckEmpty"的结果是"Not Null"虽然 我免费做了根?

我应该修改什么才能得到"CheckEmpty"为"Null"的结果?

谢谢你的帮助.

推荐答案

函数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");
}

C++相关问答推荐

根据工具链文件中的定义替换单个函数定义

传递给空闲的无效地址0x71 db7 cb5e0:未分配值

有什么方法可以检测SunOS上的SparcWorks吗?

%p与char* 等组合缺少的GCC Wform警告

为什么在传输 Big Data 时共享内存段的运行时间比管道更长?

字符串令牌化xpath表达式

为什么我不能只在内存地址中添加一个int来寻址任何数组?

为什么将函数名括在括号中会禁用隐式声明?

在每种If-Else情况下执行语句的最佳方式

==284==错误:AddressSaniizer:堆栈缓冲区下溢

为什么未初始化的 struct 的数组从另一个数组获取值?

在函数外部使用内联ASM时无法指定操作数

Valgrind正在使用一个Fexecve电话报告不可能发生的事情

';malloc():损坏的顶部大小';分配超过20万整数后

解密Chrome加密密钥

将不同类型的指针传递给函数(C)

If语句默认为true

%g浮点表示的最大字符串长度是多少?

C 和 C++ 标准如何告诉您如何处理它们未涵盖的情况?

#define X Defined(Y) 是有效的 C/C++ 宏定义吗?