簡體   English   中英

C ++刪除整個二進制搜索樹

[英]c++ delete entire binary search tree

由於某些原因,我的節點似乎並未刪除。 它看起來好像遍歷了ok一樣,但是在“刪除”節點之后,它中仍然有數據。 我也嘗試過free(bNode)bNode = NULL而不是delete bNode但是它們都給出相同的結果。

當我嘗試調試時, cout和display函數才被放入。 我只是不明白為什么它不起作用,我希望我不會缺少簡單的東西。

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;
}

“使用0。” NULL“宏不是類型安全的;如果您必須使用” null“,則將其設為const int而不是C樣式的” #define“。另請參見” C ++編程語言“支持Stroustrup反對使用“ NULL”的說法。”

我會嘗試更改:

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

 if (!bNode) { ... }

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

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

然后看一下有關如何正確刪除Struct的答案

最簡單的解決方案:

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.
}

您的解決方案是正確的,但是您的觀察結果是錯誤的。 刪除對象時,將為該對象執行析構函數。 在您的情況下,此析構函數沒有可見的副作用,因為您的所有數據成員都是純舊的數據類型,它們本身沒有析構函數。 在刪除對象后使用對象,會調用未定義的行為,您的觀察可能是“未定義的行為”的一種體現。

在調用deleteAllBooks()之前,對!= 0的測試是多余的:

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

一樣,但可能更容易理解。

並且不要將free / alloc與new / delete混合使用。 如果為對象分配了new,則必須使用delete將其返回。 否則,您將獲得未定義的行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM