Binary tree 二叉搜索树删除节点函数

Binary tree 二叉搜索树删除节点函数,binary-tree,Binary Tree,我正在处理一个二进制搜索树,我得到了一个insertnode函数 void insertNode(Node **t, Node *n) { if(!(*t)) *t=n; else if((*t)->key<n->key)insertNode(&(*t)->right,n); else if((*t)->key>n->key) insertNode(&(*t)->left,n);

我正在处理一个二进制搜索树,我得到了一个insertnode函数

  void insertNode(Node **t, Node *n)
  {
       if(!(*t))
     *t=n;

     else if((*t)->key<n->key)insertNode(&(*t)->right,n);
     else if((*t)->key>n->key) insertNode(&(*t)->left,n);
  }
void insertNode(节点**t,节点*n)
{
如果(!(*t))
*t=n;
如果(*t)->keykey)insertNode(&(*t)->right,n);
如果((*t)->key>n->key)insertNode(&(*t)->left,n);
}
我正在尝试编写一个递归删除节点的函数,到目前为止,我已经想到了:

     void remove(int huntKey,Node **t)
   {
bool keyFound=false;
if(!(*t))
         cout<<"There are no nodes"<<endl;

    while(keyFound==false)
    {
        if((*t)->key==huntKey)
        {
            keyFound=true;
            (*t)->key=0;
        }
        else if((*t)->key < huntKey)remove(huntKey,&(*t)->right);
        else if((*t)->key> huntKey) remove(huntKey,&(*t)->left);
    }
       }
void删除(int-huntKey,节点**t)
{
bool-keyFound=false;
如果(!(*t))
库特里赫特);
否则,如果((*t)->键>亨特键)移除(亨特键,&(*t)->左键);
}
}
这两个函数都是从我的主函数中的一个开关调用的,该开关如下所示:

    int main()
    {
 int key=0,countCatch=0;char q;
 Node *t, *n;
 t=0;
 while((q=menu()) !=0)
 {
     switch(q)
     {
     case'?': menu(); break;
     case'i': inOrderPrint(t); break;
     case'a': preOrderPrint(t); break;
     case'b': postOrderPrint(t); break;
     case'c': {cout<<"enter key: ";cin>>key;
     n=createNode(key);insertNode(&t,n);break;}

     case'r':{cout<<"enter the key you want removed: ";
     cin>>key;
     remove(key,&t);
     break;}

     case'n': {countCatch=countNodes(t);cout<<countCatch<<"\n"; };break;
     }
 }


 return 0;
     }
intmain()
{
int key=0,countCatch=0;char q;
节点*t,*n;
t=0;
而((q=menu())!=0)
{
开关(q)
{
大小写“?”:菜单();中断;
案例“i”:inOrderPrint(t);break;
案例“a”:预订单打印(t);中断;
案例“b”:postOrderPrint(t);中断;
案例c:{coutkey;
n=createNode(键);insertNode(&t,n);break;}
案例'r':{coutkey;
移除(键和t);
中断;}

案例'n':{countCatch=countNodes(t);cout删除节点时,您只是将其键设置为'0',而不是实际删除它

例如: “4”有子“2”,后者有子“1”和“3”

在代码中,删除“2”会生成以下树:4有子0,子0有子1和3

要删除内部节点(具有子节点的节点),必须处理其父指针及其子节点。必须将父节点的子指针设置为已删除节点的子节点之一。有关详细信息,请参阅本文:


删除节点时,您只是将其键设置为“0”,而不是实际删除它

例如: “4”有子“2”,后者有子“1”和“3”

在代码中,删除“2”会生成以下树:4有子0,子0有子1和3

要删除内部节点(具有子节点的节点),必须处理其父指针及其子节点。必须将父节点的子指针设置为已删除节点的子节点之一。有关详细信息,请参阅本文:


看看代码,它不是递归的
看看代码,它不是递归的