我正在阅读AVL树上的一些示例源代码,部分实现是以下函数:
AvlTree MakeEmpty( AvlTree T )
{
if( T != NULL )
{
MakeEmpty( T->Left );
MakeEmpty( T->Right );
free( T );
}
return NULL;
}
在main函数中,使用如下:
int main()
{
AvlTree T;
T = MakeEmpty( NULL );
然后主函数移动到AVL树中的插入数字。我的主要问题是
a)MakeEmpty功能的目的是什么?我知道它是一个递归函数,但我不明白它的用途。
b)为什么将NULL值传递给这个函数?
非常感谢!
此外,AVLTree是指向此结构的指针:
struct AvlNode
{
ElementType Element;
AvlTree Left;
AvlTree Right;
int Height;
};
答案 0 :(得分:1)
这看起来像ctor
的c风格dtor
和AvlNode
。
在C ++中,您可以执行类似
的操作struct AvlNode
{
ElementType Element;
AvlTree Left;
AvlTree Right;
int Height;
AvlNode()
: Left(NULL), Right(NULL), Height(0)
{}
~AvlNode()
{
// free node
}
};
但你不能在C中这样做。所以基本上,MakeEmpty
只是为了确保两个指针都不指向随机地址,而是指向NULL
。
答案 1 :(得分:1)
a)MakeEmpty功能的目的是什么?我知道它是一个递归函数,但我不明白它的用途。
makeEmpty()
为所有节点提供免费内存,而后续旅行则如其名称所示。注意,在一个节点被处理后,它不会再次引用,所以free()所有节点的后序都是正确的,因为释放的节点不应该再次引用。
b)为什么将NULL值传递给这个函数?
它只是初始化 T到NULL的对称方式。 notice MakeEmpty( NULL );
返回null,因为null是发送的。
T = MakeEmpty( NULL );
== T = NULL
修改
MakeEmpty()如何运作? (阅读评论)
AvlTree MakeEmpty( AvlTree T )
{
if( T != NULL )
{
MakeEmpty( T->Left ); // but in stack
MakeEmpty( T->Right ); // but in stack
free( T ); // free node
}
return NULL; // if T is passed NULL then it returns NULL
}
for(B)answer T = MakeEmpty( NULL );
返回NULL。
答案 2 :(得分:1)
以下是我对代码的理解:
“MakeEmpty函数的目的是什么?我理解它是一个递归函数,但我不明白它的用途。”
在int main()中,基本上你是在创建一个AvlTree对象。 MakeEmpty传递Null的原因是因为你需要一个空树节点,右边和左边的子节点都是未定义的。
湾为什么它被传递为null? Null终止递归,因为想法是创建空树,未定义子节点,传入Null将创建“emtpy对象”。
基本上,就我所知,整段代码都是创建一个空的AvlTree。 HTH。感谢。
答案 3 :(得分:1)
a)它正在清空树 - 即释放所有节点
b)因为它是一个递归函数,它会在到达叶子时传递null,尽管它可以在下一次递归调用之前轻松检查null