在顺序后继的递归代码中查找seg错误

时间:2013-06-13 22:20:31

标签: c++ recursion segmentation-fault inorder

嘿伙计们,我只是在二叉搜索树上练习递归代码。我遇到了一个段错误,但我不确定问题出在哪里(可能是一些愚蠢的盯着我的脸)。我有其他功能正常工作,如计算节点数或计算树的高度。这个功能特别给我带来了麻烦。我用c ++编写。

//wrapper function
int table::in_order_successor()
{
    node * temp;
    temp = root;
    in_order_successor(root, temp);  
}

//Find the in-order successor
int table::in_order_successor(node * root, node * temp)
{
    if(root == NULL) return 0;

    if(root->right != NULL)
             if(root->data == temp->data)
                    in_order_successor(root, temp->right);

    in_order_successor(root, temp->left);

    return temp->data;
}

我的想法是让函数从根向右移动一次,然后尽可能地继续向左移动。如果我的root->数据等于我的temp->数据(数据只是一个随机生成的int),我只希望它向右移动一次。

2 个答案:

答案 0 :(得分:0)

对于Seg错误,您应该检查temp是否为null,因为您的代码可能会将temp->righttemp->left传递给它null

  if(temp == NULL) return 0; // add this check

但是代码中还有另一个问题:您永远不会重用返回值。然后它会迭代。假设您想在遍历后返回存储在叶节点中的数据,那么代码可能如下所示:

//Find the in-order successor
int table::in_order_successor(node * root, node * temp) {
  if(root == NULL) return 0;
  if(temp == NULL) return 0; // add this check

  if(root->right != NULL) {
     // check by pointer instead of the data unless each
     // node->data is unique.  Otherwise unwanted moving
     // right will occur.
     if(root == temp) {           
       if (temp->right != null) {
         // use `return` here instead of plain function call to get
         // the update of the rest of the recursion.
         return in_order_successor(root, temp->right);
       }
     }
  }

  if (temp->left != null) {
    // if have left child, return what you will find in the next step
    return in_order_successor(root, temp->left); // use return here
  } else {
    // reach the left-most leaf after first steping right at root node.
    return temp->data;
  }
}

答案 1 :(得分:0)

另外

 if(temp->left != NULL)
    in_order_successor(root, temp->left);

if(!temp-> left)
  return temp->data;