递归调用二叉树析构函数

学习者

据我了解,此代码适用于二进制搜索树析构函数:

~tree(){

    remove(root);
}

void remove(node* root) 
{
    if (root == NULL) return;
    remove(root->left);
    remove(root->right);
    delete root;
}

但是,我想知道以下对析构函数的调用是否有效?

~node(){
    delete left;
    delete right;
}

~tree(){
    delete root;
}

我的理解是,删除根节点将自动调用子节点,并同时删除它们。这是正确的假设吗?如果确实是正确的,那么有什么简单的方法可以验证析构函数是否正常工作?

{{帖子的此部分已在以后添加}}

我在这里使用第二种方法。通过输出表达式验证,下面的代码似乎不起作用,因为我得到的是单个delete输出(这似乎是针对根节点的)

struct node{

    ~node(){
     delete left;
     delete right;
     }  
};

class tree {
     node* root;

public:

     tree(){
         root=NULL;
     }

     ~tree(){
         cout<<"Deleting: "<<endl;
         delete root;
      }

      void insert (int x){};
}

int main(){

      A.insert(12);A.insert(13);A.insert(10);

      return 0;
} 

这是我得到的输出:

 Deleting:

理想情况下,应该有3个这样的表达式,但我只能得到1个。

来自莫斯科的弗拉德

是的,只要叶节点的左和右等于nullptr,它将起作用。

根据C ++标准(5.3.5删除)

6如果delete-expression的操作数的值不是空指针值,则delete-expression将为要删除的对象或数组元素调用析构函数(如果有)。对于数组,元素将按照地址递减的顺序销毁(即,按其构造函数完成的相反顺序;请参阅12.6.2)。

因此,仅当节点不是空指针值时才调用节点的析构函数。

如果要检查析构函数确实在工作,则只需在析构函数的主体中插入输出语句即可。

这是一个示范节目

#include <iostream>

struct node
{
    node *next;
    int x;
    ~node()
    {
        std::cout << "inside node: " << x << std::endl;
        delete next;
    }
};

void push_front( node **tree, int x )
{
    node *n = new node;
    n->x = x;
    n->next = *tree;

    *tree = n;
}

void clear( node **tree )
{
    delete *tree;
    *tree = nullptr;
}

int main()
{
    node *tree = nullptr;

    for ( int i = 0; i < 10; i++ ) push_front( &tree, i );

    clear( &tree );
}

输出是

Compiled with /EHsc /nologo /W4
main.cpp

Compilation successful!

Total compilation time: 187ms

inside node: 9

inside node: 8

inside node: 7

inside node: 6

inside node: 5

inside node: 4

inside node: 3

inside node: 2

inside node: 1

inside node: 0

Total execution time: 734ms

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章