2012-04-28 100 views
0

我正在从二叉搜索树中删除节点,并且在此函数的while循环之后不断收到segfault错误。如果可以,请帮我找出任何错误。C++二进制搜索删除节点的树错误

下面是函数:

void deleteNode() 
    { 
     int key; 
     nodePtr location = NULL, parent = NULL; 

     cout << "Enter account number to delete: "; 
     cin >> key; 
     cout << endl << endl; 

     bool found = searchTree(key, &location, &parent); 

     if (!found) 
     { 
     cout << "Error! Account number: " << key << " was not found." 
     << endl << endl; 
     } 
     else if (location->left != NULL && location->right != NULL) 
     { //delete node with left and right subtrees 
     nodePtr leftmost = location->right, leftmostParent = NULL; 

     while (leftmost->left != NULL) 
     { 
      leftmostParent = leftmost; 
      leftmost = leftmost->left; 
     } 

     leftmost->left = location->left; 

     if (location->right != leftmost) 
      leftmost->right = location->right; cout << "1" << endl; 

     if (parent != NULL) 
     { 
      if (parent->acctNum > location->acctNum) 
       parent->left = leftmost; 
      else 
       parent->right = leftmost; 
     } 

     leftmostParent->left = NULL; 

     delete location; 
     location = NULL; 
     } 
     else if (location->left != NULL && location->right == NULL) 
     { //delete node with only a left subtree 
     if (parent->acctNum > location->acctNum) 
      parent->left = location->left; 
     else 
      parent->right = location->left; 

     delete location; 
     location = NULL; 
     } 
     else if (location->left == NULL && location->right != NULL) 
     { //delete node with only a right subtree 
     nodePtr leftmost = location->right, leftmostParent = NULL; 

     while (leftmost->left != NULL) 
     { 
      leftmostParent = leftmost; 
      leftmost = leftmost->left; 
     } 

     leftmost->right = location->right; 
     leftmostParent->left = NULL; 

     if (parent->acctNum > location->acctNum) 
      parent->left = leftmost; 
     else 
      parent->right = leftmost; 

     delete location; 
     location = NULL; 
     } 
     else 
     { //delete a leaf node 
     if (location->acctNum > parent->acctNum) 
      parent->right = NULL; 
     else 
      parent->left = NULL; 

     delete location; 
     location = NULL; 
     } 
    } 

回答

1

我看到这里有一个问题

nodePtr leftmost = location->right, leftmostParent = NULL; 

while (leftmost->left != NULL) 
{ 
    leftmostParent = leftmost; 
    leftmost = leftmost->left; 
} 
... 

leftmostParent->left = NULL; 

如果位置 - >右边是一片树叶,然后leftmostParent从未设置,仍然指向NULL;所以会segfault。

+0

这个工作,并且我忘记了在删除以前的根时将root设置为新的顶层节点。愚蠢的错误 – 2012-04-28 02:25:12