首页 文章

如何删除二叉树中的节点[重复]

提问于
浏览
-6

这个问题在这里已有答案:

程序很简单,请执行以下步骤:

  • 找到二叉树的最小值;

  • 记录向量中的最小值;

  • 删除树中具有最小值的节点;

  • 重复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 ,返回2 if 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 回答

  • 1
    sortedvector[nmax] = minValue(Root,min) ;
    removeNode(Root,sortedvector[nmax]);//change here
    nmax++;
    

    你有问题通过分钟 . 我在这里回答,不只是阅读 Headers 和投票 .

相关问题