【问题标题】:AVL tree sample explanationAVL树样例说明
【发布时间】:2013-03-29 19:32:23
【问题描述】:

我正在阅读一些关于 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;
};

【问题讨论】:

    标签: c avl-tree


    【解决方案1】:

    以下是我对代码的理解:

    “MakeEmpty 函数的作用是什么?我明白它是一个递归函数,但我不明白它的作用。”

    在 int main() 内部基本上你正在创建一个 AvlTree 对象。 MakeEmpty 传递 Null 的原因是因为您想要一个空的树节点,其左右子节点未定义。

    b.为什么它被传递为null? Null 终止递归,因为想法是创建空树,其中未定义的子节点传入 Null 将创建“emtpy 对象”。

    据我所知,这整段代码基本上是在创建一个空的 AvlTree。 HTH。谢谢。

    【讨论】:

      【解决方案2】:

      a) 它正在清空树 - 即释放所有节点

      b) 因为它是一个递归函数,所以它会在到达叶子节点时传递 null,尽管它可以在下一次递归调用之前轻松检查 null

      【讨论】:

        【解决方案3】:

        这看起来像 c 风格的 ctordtor for 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

        【讨论】:

        • 你能解释一下什么是c风格的构造函数吗?
        • @user1816546 只是为了确保指针指向NULL
        【解决方案4】:

        a) MakeEmpty 函数的目的是什么?我知道它是一个递归函数,但我不明白它的用途。

        makeEmpty() 函数为所有节点释放内存,同时按其名称所示后序移动。注意在后序遍历器中,一旦处理了一个节点,它就不会再次被引用,因此对于 free(),所有节点的后序都是正确的,因为已释放的节点不应再次被引用。

        b) 为什么将 NULL 值传递给该函数?

        它只是一种将 初始化 T 为 NULL 的对称方式。注意MakeEmpty( NULL ); 返回 null,因为发送的是 null。

                T = MakeEmpty( NULL );
        ==      T = NULL
        

        编辑

        MakeEmpty() 是如何工作的? (阅读 cmets)

        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
        }
        

        对于 (B) 回答 T = MakeEmpty( NULL ); 返回 NULL。

        【讨论】:

        • 该函数在数据加载到 AVL 树之前被调用。如果一开始没有分配内存,它如何释放内存?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-13
        • 2016-10-13
        • 1970-01-01
        • 1970-01-01
        • 2011-09-14
        • 2013-10-29
        相关资源
        最近更新 更多