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

时间:2016-09-01 17:48:36

标签: c++ binary-search-tree

我无法删除BST的所有节点以供重用。对于第一组输入,我的代码正常工作但后来输入失败。 我google了很多,找不到与我的问题相关的任何解决方案。 为了澄清,我正在粘贴我的完整源代码。 我之前在这里问过这个问题 How to delete all nodes of a Binary Search Tree 我不太了解python。 为此,再次询问此主题。

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

2 个答案:

答案 0 :(得分:1)

通过引用传递root,并在删除完成后将其设置为NULL

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

在您的版本中,指针将按值传递,并且在函数内对其进行的更改将永远不会出现在函数范围之外。

使用上面显示的签名,并在函数内部设置rootNULL,您可以(重新)再次使用insert()并将root节点设置为{调用NULL之后{1}}。

请参阅Live Demo

答案 1 :(得分:0)

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

注意:这里发生了后期处理删除,因为一旦删除了左右两个子对象,根必须被删除