这个问题在这里已有答案:
程序很简单,请执行以下步骤:
-
找到二叉树的最小值;
-
记录向量中的最小值;
-
删除树中具有最小值的节点;
-
重复1-3直到树空了 .
运行时没有报告错误,但函数removeNode保持 printf("Remove bug1!\n");
我找不到任何逻辑错误,所以我不明白为什么会发生这种情况 . 该功能的结构是:
-
'如果min = key`,找到它,调用函数removeRootMatch
-
否则,如果
min<root->key
并且'left is not NULL`,则向左移动 -
否则打印
bug
树定义如下,语言为c
typedef struct myNode* LPNode;
typedef struct myNode Node;
struct myNode
{
double key;
LPNode Left; //left subtree
LPNode Right; //right subtree
};
计划的主要部分如下:
-
nmax初始化为0,
-
sortedvector是一个向量,它的空间与树中的总节点一样大,
-
min初始化为99999 .
-
minValue将返回树的最小值 .
-
compareDouble(a,b)将返回1
if a < b
,返回2if a > b
,如果相等则返回3
// remove root void removeRootMatch(LPNode Root){LPNode tmp = MakeNewNode(Root-> key); tmp-> Left = Root-> Left; tmp-> Right = Root-> Right; //没有子if(Root-> Left == NULL && Root-> Right == NULL) else if(Root-> Left == NULL && Root-> Right!= NULL){//一个右子Root = Root-> Right; tmp-> Right = NULL;删除tmp;
} else {printf("Remove root bug!\n"); }}
//remove a node
void removeMatch(LPNode Root,LPNode match,bool left)
{
//no child
if(match->Left==NULL && match->Right == NULL){
left==true?
Root->Left=NULL:
Root->Right=NULL;
delete match;
}
else if(match->Left==NULL && match->Right!=NULL){//one right child
left==true?
Root->Left=match->Right:
Root->Right=match->Right;
delete match;
} else {
printf("Remove root bug!\n");
}
}
//delete a node
void removeNode(LPNode Root,double min)
{
if(compareDouble(min,Root->key)==3){
removeRootMatch(Root);
}else if(compareDouble(min,Root->key)==1 && Root->Left != NULL) {
compareDouble(min,Root->key)==3 ?
removeMatch(Root,Root->Left,true):
removeNode(Root->Left,min);
}else{
printf("Remove bug1!\n");
}
}
这是函数调用removeNode函数 .
//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");
}
1 回答
你有问题通过分钟 . 我在这里回答,不只是阅读 Headers 和投票 .