更新:removeNode代码修订。没有错误,可以运行,但没有输出。输出应该只是打印出main函数中的向量。我现在还在检查bug。非常感谢您的帮助。如果有人发现任何虫子,请告诉我。非常感谢。
=======================
我得到的错误是*** glibc detected *** ./bintree: double free or corruption (fasttop): 0x0000000000727060 ***
程序很简单,请执行以下步骤:
树定义如下,语言为c ++
typedef struct myNode* LPNode;
typedef struct myNode Node;
struct myNode
{
double key;
LPNode Left; //left subtree
LPNode Right; //right subtree
};
这是一个简单的删除节点功能,因为每次删除最小值。节点很像叶子,所以不那么复杂。 compareDouble(double a,double b)将返回true
if a < b
; false
if a > b
//delete a node
void removeNode(LPNode Root,double min)
{
if(compareDouble(min,Root->key)) {
if(Root->Left != NULL)
removeNode(Root->Left,min);
else
printf("Remove bug!\n");
}else{
//delete Root;
//Root=Root->Right;
LPNode tmp = MakeNewNode(Root->key);
tmp->Left = Root->Left;
tmp->Right = Root->Right;
delete Root;
Root=tmp->Right;
}
}
nmax初始化为0,sortedvector是一个矢量,其空间与树中的总节点一样大,min的初始值为99999.minValue将返回树的最小值。
//call minValue to find the min key
//record the min key in a vector
//call removeNode to delete the Node
//repeat till the tree is empty
void problem1(LPNode Root,double* sortedvector,int& nmax)
{
double min = MAX;
while(Root!=NULL)
{
sortedvector[nmax] = minValue(Root,min) ;
nmax++;
removeNode(Root,min);
}
printf("The tree is empty");
}
答案 0 :(得分:0)
将std::unique_ptr
用于节点而非LPNode
更好。那么你甚至不必做任何delete
s,更不用说追逐它们所带来的错误了。在您Root
之后,您的一个错误是使用delete
:
delete Root;
Root=Root->Right;
你需要更像的东西:
NewRoot = Root->Right;
delete Root;
Root = NewRoot;