2017-08-04 112 views
0

程序运行后会崩溃什么是我的程序(二叉搜索树)的段错误

下面是我的整个程序。

它具有分段错误,但我不知道怎么纠正

程序将会崩溃运行

下面是我的整个程序之后。

有段错误,但我不知道怎么纠正

#include<iostream> 
using namespace std; 
class BinarySearchTree 
{ 
    public: 
    struct Node 
    { 
     int element; 
     Node *left; 
     Node *right; 
     Node(const int &ele,Node *lt,Node *rt) 
      :element{ele},left{lt},right{rt} {} 
    }; 
    Node *root; 
    void insert(const int &ele) 
    { 
     insert(ele,root); 
    } 
    void in_order() 
    { 
     inorder(root); 
    } 
    void post_order() 
    { 
     postorder(root); 
    } 
    void desc_order() 
    { 
     descorder(root); 
    } 
    void remove(int x) 
    { 
     remove(x,root); 
    } 
    void pre_order() 
    { 
     preorder(root); 
    } 

    BinarySearchTree() 
    { 
     root==NULL; 

    } 
    ~BinarySearchTree() 
    { 
     makeEmpty(root); 
    } 
    void makeEmpty(Node* & t) 
    { 
     if(t!= NULL) 
     { 
      makeEmpty(t->left); 
      makeEmpty(t->right); 
      delete t; 

     } 
     t=NULL; 
    } 

    void insert(const int &x,Node * & t) 
    { 
     if(t==NULL) 
      t=new Node{x,NULL,NULL}; 
     else if(x<t->element) 
      insert(x,t->left); 
     else if(x>t->element) 
      insert(x,t->right); 
    } 

    void inorder(Node *r) 
    { 
     if(r!=NULL) 
     { 

      postorder(r->left); 
      cout<<r->element<<" "; 
      postorder(r->right); 
     } 
    } 

    void postorder(Node *r) 
    { 
     if(r!=NULL) 
     { 
      postorder(r->left); 
      postorder(r->right); 
      cout<<r->element<<" "; 
     } 
    } 

    void preorder(Node *r) 
    { 
     if(r!=NULL) 
     { 
      cout<<r->element<<" "; 
      postorder(r->left); 
      postorder(r->right); 
     } 
    } 

    void descorder(Node *r) 
    { 
     if(r!=NULL) 
     { 
      postorder(r->right); 
      cout<<r->element<<" "; 
      postorder(r->left); 
     } 

    } 

    Node *findmin(Node*t) 
    { 
     if(t==NULL) 
      return NULL; 
     if(t->left==NULL) 
      return t; 
     return findmin(t->left); 
    } 

    void remove(int x, Node * &t) 
    { 
     if(t==NULL) 
      return; 
     if(x<t->element) 
      remove(x,t->left); 
     else if(t->element<x) 
      remove(x,t->right); 
     else if(t->left!=NULL&&t->right!=NULL) 
     { 
      t->element=findmin(t->right)->element; 
      remove(t->element,t->right); 
     } 
     else 
     { 
      Node *oldNode=t; 
      t=(t->left!=NULL)?t->left:t->right; 
      delete oldNode; 
     } 
    } 
}; 

int main() 
{ 
    BinarySearchTree BST; 
    int N; 
    cin>>N; 
    int ele; 
    for(int i=0; i<N; i++) 
    { 
     cin>>ele; 
     BST.insert(ele); 

    } 

    cout<<"PRE_ORDER:"; 
    BST.pre_order(); 
    cout<<endl; 
    cout<<"IN_ORDER:"; 
    BST.in_order(); 
    cout<<endl; 
    cout<<"POST_ORDER:"; 
    BST.post_order(); 
    cout<<endl; 
    cout<<"DESCENDING_ORDER:"; 
    BST.desc_order(); 
    cout<<endl; 

    int dele; 
    cin>>dele; 
    BST.remove(dele); 

    cout<<"NEW TREE AFTER DELETING "<<dele<<endl; 
    cout<<"PRE_ORDER:"; 
    BST.pre_order(); 
    cout<<endl; 
    cout<<"IN_ORDER:"; 
    BST.in_order(); 
    cout<<endl; 
    cout<<"POST_ORDER:"; 
    BST.post_order(); 
    cout<<endl; 
    cout<<"DESCENDING_ORDER:"; 
    BST.desc_order(); 

    return 0; 
} 

为什么我的程序不能运行? 衷心感谢您的帮助

+0

使用调试器,并通过你的程序步骤。投票结束。 –

+0

根分配错误 –

回答

0

有在你的代码一些错误,如下面这导致了问题

平等比较分配

BinarySearchTree() 
{ 
    root==NULL; 

} 

改变它

root = NULL 

在此之后完美作品

输出

4 
1 
2 
3 
4 
PRE_ORDER:1 4 3 2 
IN_ORDER:1 4 3 2 
POST_ORDER:4 3 2 1 
DESCENDING_ORDER:4 3 2 1 

更正代码

#include<iostream> 
using namespace std; 
class BinarySearchTree 
{ 
public: 
    struct Node 
    { 
     int element; 
     Node *left; 
     Node *right; 
     Node(const int &ele,Node *lt,Node *rt) 
     :element{ele},left{lt},right{rt} {} 
    }; 
    Node *root; 
    void insert(const int &ele) 
    { 
     insert(ele,root); 
    } 
    void in_order() 
    { 
     inorder(root); 
    } 
    void post_order() 
    { 
     postorder(root); 
    } 
    void desc_order() 
    { 
     descorder(root); 
    } 
    void remove(int x) 
    { 
     remove(x,root); 
    } 
    void pre_order() 
    { 
     preorder(root); 
    } 


    BinarySearchTree() 
    { 
     root = NULL; 

    } 
    ~BinarySearchTree() 
    { 
     makeEmpty(root); 
    } 
    void makeEmpty(Node* & t) 
    { 
     if(t!= NULL) 
     { 
      makeEmpty(t->left); 
      makeEmpty(t->right); 
      delete t; 

     } 
     t=NULL; 
    } 

    void insert(const int &x,Node * & t) 
    { 
     if(t==NULL) 
      t=new Node{x,NULL,NULL}; 
     else if(x<t->element) 
      insert(x,t->left); 
     else if(x>t->element) 
      insert(x,t->right); 
    } 



    void inorder(Node *r) 
    { 
     if(r!=NULL) 
     { 

      postorder(r->left); 
      cout<<r->element<<" "; 
      postorder(r->right); 
     } 
    } 

    void postorder(Node *r) 
    { 
     if(r!=NULL) 
     { 
      postorder(r->left); 
      postorder(r->right); 
      cout<<r->element<<" "; 
     } 
    } 

    void preorder(Node *r) 
    { 
     if(r!=NULL) 
     { 
      cout<<r->element<<" "; 
      postorder(r->left); 
      postorder(r->right); 
     } 


    } 

    void descorder(Node *r) 
    { 
     if(r!=NULL) 
     { 
      postorder(r->right); 
      cout<<r->element<<" "; 
      postorder(r->left); 
     } 

    } 
    Node *findmin(Node*t) 
    { 
     if(t==NULL) 
      return NULL; 
     if(t->left==NULL) 
      return t; 
     return findmin(t->left); 
    } 

    void remove(int x, Node * &t) 
    { 
     if(t==NULL) 
      return; 
     if(x<t->element) 
      remove(x,t->left); 
     else if(t->element<x) 
      remove(x,t->right); 
     else if(t->left!=NULL&&t->right!=NULL) 
     { 
      t->element=findmin(t->right)->element; 
      remove(t->element,t->right); 
     } 
     else 
     { 
      Node *oldNode=t; 
      t=(t->left!=NULL)?t->left:t->right; 
      delete oldNode; 
     } 


    } 


}; 

int main() 
{ 
    BinarySearchTree BST; 
    int N; 
    cin>>N; 
    int ele; 
    for(int i=0; i<N; i++) 
    { 
     cin>>ele; 
     BST.insert(ele); 

    } 

    cout<<"PRE_ORDER:"; 
    BST.pre_order(); 
    cout<<endl; 
    cout<<"IN_ORDER:"; 
    BST.in_order(); 
    cout<<endl; 
    cout<<"POST_ORDER:"; 
    BST.post_order(); 
    cout<<endl; 
    cout<<"DESCENDING_ORDER:"; 
    BST.desc_order(); 
    cout<<endl; 


    int dele; 
    cin>>dele; 
    BST.remove(dele); 

    cout<<"NEW TREE AFTER DELETING "<<dele<<endl; 
    cout<<"PRE_ORDER:"; 
    BST.pre_order(); 
    cout<<endl; 
    cout<<"IN_ORDER:"; 
    BST.in_order(); 
    cout<<endl; 
    cout<<"POST_ORDER:"; 
    BST.post_order(); 
    cout<<endl; 
    cout<<"DESCENDING_ORDER:"; 
    BST.desc_order(); 



    return 0; 
} 
+0

谢谢!该程序可以运行。我发现我在遍历中所犯的错误。感谢您的帮助! – Maotuzhi

+0

如果有帮助,请接受答案 –