二叉搜索树删除节点功能

时间:2011-04-05 16:23:27

标签: 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);
  }

我正在尝试编写一个函数来递归删除节点到目前为止我已经提出:

     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);
    }
       }

这两个函数都是从我的main函数中的一个开关调用的,如下所示:

    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;
     }

我的删除节点功能无法正常工作....任何建议都会有所帮助......

2 个答案:

答案 0 :(得分:1)

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

实施例: '4'有孩子'2',孩子'1'和'3'。

在你的代码中,删除'2'会给你这棵树:4有孩子0,有孩子1和3。

要删除内部节点(具有子节点的节点),必须处理其父指针及其子节点。您必须将父级的子指针设置为已删除节点的子节点之一。请查看此文章了解更多信息:

http://en.wikipedia.org/wiki/Binary_tree#Deletion

答案 1 :(得分:0)

查看代码,但它不是递归的 http://code.google.com/p/cstl/source/browse/src/c_rb.c