2014-10-02 104 views
-1

我试图创建在C++一个简单的二叉搜索树类,但每当我打电话给我的插入功能:C++ - 函数调用的分割错误?

template<typename T> 
void BSTree_Fast<T>::insert(T & key) 
{ 
    cout<<"working"; 
    int i=0; 
    BSTNode<T> *newNode=new BSTNode<T>(key); //Initializing pointer to newNode with key as Key 
    if(maxDepth==0){    //if tree is empty, sets root to new node 
    root=newNode; 
    setMaxDepth(1); 
    } 
    BSTNode<T> *curr=root;   //Traversal unit curr 
    if(key==curr->getKey()){   //checking if inserted key is same as root key 
    int n=curr->getNum(); 
    n++; 
    curr->setNum(n); 
    delete(newNode); 
    } 
while(key!=curr->getKey()){   //first while loop when above is not true 
    if(key<curr->getKey()){   //checks left if key < current key 
    if(curr->getLeft()==NULL){  //if cannot traverse left, creates new node to left of current 
     curr->setLeft(newNode); 
     if(i>maxDepth){ 
      cout<<i; 
      setMaxDepth(i); 
     } 
     break; 
    } 
    else if(curr->getLeft()->getKey()==key){//if left child equals input key, increase number 
     int n=curr->getLeft()->getNum(); 
     n++; 
     curr->getLeft()->setNum(n); 
     delete(newNode); 
     break; 
    } 
    else{ 
     i++; 
     curr=curr->getLeft();  //traverses left 
    } 
    } 
    if(key>curr->getKey()){   //checks right if key > current key 
    if(curr->getRight()==NULL){  //if cannot traverse right, creates new node to right 
     curr->setRight(newNode); 
     if(i>maxDepth){ 
      setMaxDepth(i); 
     } 
     break; 
    } 
    else if(curr->getRight()->getKey()==key){//if right child equals input key, increase number 
     int n=curr->getRight()->getNum(); 
     n++; 
     curr->getRight()->setNum(n); 
     delete(newNode); 
     break; 
    } 
    else{ 
     i++; 
     curr=curr->getRight();  //traverses to right 
    } 
    } 
} 
} 

但是它打电话时似乎打了一个段错误之前的任何实际的代码可以实现它带有从文件读入的字符串。

+0

输出可能是行缓冲。你有没有试过在函数的开头添加一个换行符 - “<< endl” - 你的日志语句?代码后面有很多地方可能导致段错误(例如,如果第一次插入时'root'为空)。您需要自己进一步调试或提供完整的可运行示例以获得更具体的帮助 – simonc 2014-10-02 16:41:49

+3

您忘记提问了。当你按下“提问问题”按钮时,你应该会询问具体的问题。你讲了一个故事,然后停下来,让我们猜测你的实际问题是什么。它可能来自“什么是分段错误?”到“我的代码看起来是否合理?”。 – 2014-10-02 16:44:38

回答

4

漫步加入的第一个节点的过程:

BSTNode<T> *newNode=new BSTNode<T>(key); //Initializing pointer to newNode with key as Key 
    if(maxDepth==0){    //if tree is empty, sets root to new node 
    root=newNode; 
    setMaxDepth(1); 
    } 

嗯哦,这里没有return。所以在设置了root=newNode后,我们继续。

BSTNode<T> *curr=root;   //Traversal unit curr 
    if(key==curr->getKey()){   //checking if inserted key is same as root key 
    int n=curr->getNum(); 
    n++; 
    curr->setNum(n); 
    delete(newNode); 
    } 

显然键将匹配。所以我们刚刚删除了newNode,这也是rootcur

while(key!=curr->getKey()){ 

Ooops,我们访问我们刚刚删除的curr