嘿伙计们,我只是在二叉搜索树上练习递归代码。我遇到了一个段错误,但我不确定问题出在哪里(可能是一些愚蠢的盯着我的脸)。我有其他功能正常工作,如计算节点数或计算树的高度。这个功能特别给我带来了麻烦。我用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),我只希望它向右移动一次。
答案 0 :(得分:0)
对于Seg错误,您应该检查temp
是否为null
,因为您的代码可能会将temp->right
和temp->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;