AVL树样本说明

时间:2013-03-29 19:32:23

标签: c avl-tree

我正在阅读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;
};

4 个答案:

答案 0 :(得分:1)

这看起来像ctor的c风格dtorAvlNode

在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