如何在c++中删除BST的所有节点以便重用

How to delete all the nodes of BST for reuse in c++

本文关键字:节点 c++ BST 删除      更新时间:2023-10-16

我无法删除BST的所有节点以便重用。对于第一组输入,我的代码工作正常,但稍后输入失败。我在谷歌上搜索了很多,但找不到任何与我的问题相关的解决方案。为了澄清,我粘贴了我的完整源代码。我发现这类问题之前在这里问过如何删除二叉搜索树的所有节点我对蟒蛇不太了解。为此,我再次询问了这个话题。

    #include<bits/stdc++.h>
    using namespace std;
    int size,c=0;
    struct BstNode {
      int data;
      BstNode* left;
      BstNode* right;
    };
    BstNode* insert(BstNode* root,int data) {
      if(root==NULL) {
        root=new BstNode();
        root->data=data;
        root->left=root->right=NULL;
      }
      else if(data<root->data) {
        root->left=insert(root->left,data);
      }
      else {
        root->right=insert(root->right,data);
      }
      return root;
    }
    void preorderTraversal(BstNode* root) {
      if(root!=NULL) {
        c++;
        if(c==size) cout<<root->data<<endl;
        else cout<<root->data<<" ";
        preorderTraversal(root->left);
        preorderTraversal(root->right);
      }
    }
    void inorderTraversal(BstNode* root) {
      if(root!=NULL) { 
        inorderTraversal(root->left);
        c++;
        if(c==size) cout<<root->data<<endl;
        else cout<<root->data<<" ";
        inorderTraversal(root->right);
      }
    }
    void postorderTraversal(BstNode* root) {
      if(root!=NULL) {
        postorderTraversal(root->left);
        postorderTraversal(root->right);
        c++;
        if(c==size) cout<<root->data<<endl;
        else cout<<root->data<<" ";
      }
    }
    void deletepostorderTraversal(BstNode* root) {
      if(root!=NULL) {
        deletepostorderTraversal(root->left);
        deletepostorderTraversal(root->right);
        delete root;
      }
    }
    int main() {
      int test_case;
      while(cin>>test_case) {
        cin>>size;
        BstNode* root=NULL; //create the root
        for(int i=0;i<size;i++) {
          int data;cin>>data;
          root=insert(root,data);
        }   
        c=0;
        cout<<"Pre.: ";
        preorderTraversal(root);
        cout<<"In..: ";
        c=0;
        inorderTraversal(root);
        cout<<"Post: ";
        c=0;
        postorderTraversal(root);
        cout<<endl;
        deletepostorderTraversal(root); //delete all the nodes 
        //i can't reuse this code again.
       // root=NULL;
      //  if(root==NULL) cout<<"Deleted"<<endl;
      }
    }

通过引用传递root,删除完成后设置为NULL:

void deletepostorderTraversal(BstNode*& root) {
                                   // ^
  if(root!=NULL) {
    deletepostorderTraversal(root->left);
    deletepostorderTraversal(root->right);
    delete root;
    root = NULL; // <<<<<<<<<<<<<<<<
  }
}

在你的版本中,指针将按值传递,并且在函数内部对它所做的更改永远不会出现在函数作用域之外。

使用如上所示的签名,并在函数内将root设置为NULL,则可以在调用deletepostorderTraversal()后再次(重新)使用insert(),将root节点设置为NULL

参见现场演示

private static void deleteBinaryTree(Node root) {
    if(root == null) {
        return;
    }
    deleteBinaryTree(root.left);
    deleteBinaryTree(root.right);
    System.out.println("deleted node "+root.data);
    root = null;
}

注意:Post Order delete发生在这里,因为Root必须被删除,一旦他们的左和右子删除完成