c ++删除整个二进制搜索树

时间:2013-11-21 08:15:14

标签: c++ binary-search-tree

由于某种原因,我的节点似乎没有删除。它看起来好像遍历到最后确定但在节点被“删除”之后它仍然有数据。我也试过了 free(bNode)bNode = NULL代替delete bNode,但它们都会给出相同的结果。

当我尝试调试时,cout和显示功能刚刚放入。我只是不明白为什么它不起作用,我希望我不会错过一些简单的东西。

struct
Book{
char title [50];
char url [75];
Book *left;
Book *right;
};

void deleteAllBooks (Book *bNode){
    if(bNode==NULL) return;                                             
    if(bNode->left !=NULL){
        cout << endl << "deleting left" << endl;
        deleteAllBooks(bNode->left);
    }
    if(bNode->right !=NULL){
        cout << endl << "deleting right" << endl;
        deleteAllBooks(bNode->right);
    }
    cout << endl << "deleting node " << bNode->title << endl;
    delete bNode;
    displayBookTree(bNode);
}
void displayBookTree(Book *bNode){
    if(bNode==NULL){
        cout << "No books" << endl;
        return; 
    }
    if(bNode->left !=NULL){
        displayBookTree(bNode->left);
    }
    if(bNode->right !=NULL){
        displayBookTree(bNode->right);
    }
    cout <<"Title: " << bNode->title << endl;
    cout <<"URL: " << bNode->url <<endl;
}

3 个答案:

答案 0 :(得分:2)

“使用0.”NULL“宏不是类型安全的;如果您认为必须这样做  使用“null”,使其成为一个const int而不是C风格的“#define”。也  请参阅Stroustrup反对的“C ++编程语言”  使用“NULL”。“

我会尝试改变:

 if (bNode==NULL) { ... }

 if (!bNode) { ... }

并且

if (bNode->left !=NULL) { ... }
if (bNode->right !=NULL) { ... }

if (bNode->left) { ... }
if (bNode->right) { ... }

然后看看this answer如何正确删除Struct!

答案 1 :(得分:0)

最简单的解决方案:

struct Book{
  std::string title;
  std::string url;
  std::unique_ptr<Book> left;
  std::unique_ptr<Book> right;
};

void deleteAllBooks (std::unique_ptr<Book> bNode)
{
  // No code necessary. Literally. But usually you wouldn't even 
  // bother with this function, the default Book::~Book is fine.
}

答案 2 :(得分:0)

您的解决方案是正确的,但您的观察结果是错误的。删除对象时,将对该对象执行析构函数。在您的情况下,此析构函数没有可见的副作用,因为您的所有数据成员都是普通的旧数据类型,它们没有自己的析构函数。在删除对象后使用它,调用未定义的行为,您的观察是“未定义行为”的可能化身。

在调用deleteAllBooks()之前测试!= 0是多余的:

void deleteAllBooks ( Book *node ) 
{
    if( node ) 
    {
        deleteAllBooks( node->left );                                            
        deleteAllBooks( node->right );                                            
        delete node;
    }
}

做同样的事情,但可能更容易理解。

不要将free / alloc与new / delete混合使用。如果您已使用new分配了一个对象,则必须使用delete返回它。否则,您将得到未定义的行为。