我改编了本书中的代码:Mark Allen Weiss的数据结构和算法,第3版。
每次运行它都会崩溃。根据请求,我将添加整个二叉树代码(它的长)。每当我尝试在调试模式下运行它时,我最终在remove()
函数中的前三个if else语句之间循环,然后我最终获得此输出:
“Project 4Draft.exe中0x0007300d处的未处理异常:0xC0000005:访问冲突读取位置0x003c0000。”
我很确定这是一个段错误,只是想找到源码。此外,当我运行它时,它不会进入findMin()
,但我将其包含在内,因为它在删除范围内,并且尚未完全测试。任何人都可以帮助我推导出来源吗?
这是删除功能:
void remove(const T& x, TreeNode * & tn) const {
if(tn == NULL)
return;
else if(x < tn->data)
remove(x, tn->left);
else if(tn->data < x)
remove(x, tn->right);
else if(tn->left != NULL && tn->right != NULL) {//Two Children(Swap the min of the right subtree, and swap
tn->data = findMin(tn->right)->data;
remove(tn->data,tn->right);
}
else{
TreeNode *oldNode = tn;
tn = (tn->left != NULL ) ? tn->left : tn->right;
delete oldNode;
}
}
这里是findMin():
TreeNode * findMin(TreeNode *x) const {
if(debugMode==true){
cout << "\nWERE IN FINDMIN\n";
}
if(x==NULL){
return NULL;
}
if(x->left==NULL){
if(debugMode==true){
cout << x;
}
return x;
}
return findMin(x->left);
};
以下是我在测试文件中调用的内容:
cout << "Checking remove()\n";
for(int i =SIZE; i>0;i++){
z.remove(x[i]);
}
cout << "DONE Checking remove()\n";
答案 0 :(得分:5)
您确定您的循环条件是否正确?
for(int i =SIZE; i>0;i++){
z.remove(x[i]);
}
cout << "DONE Checking remove()\n";
也许你应该写一些类似的东西:
for(int i = 0; i < SIZE; i++){
z.remove(x[i]);
}
或
for(int i = SIZE - 1; i >= 0; i--){
z.remove(x[i]);
}