Удаление в двоичном дереве поиска

Итак, когда я удаляю в двоичном дереве поиска, мне нужно иметь примерно 7 разных случаев, например

  1. Left Leaf;
  2. Right Leaf ;
  3. Левый ребенок с единственным левым ребенком. // т.е. удаляемый узел является левым дочерним элементом своего родителя, и у него есть только левый дочерний элемент.
  4. Левый ребенок с единственным правым ребенком.
  5. Правый ребенок с единственным левым ребенком.
  6. Правый ребенок с единственным правильным ребенком.
  7. Узел, подлежащий удалению, имеет обоих дочерних узлов, то есть правый и левый.

Теперь, когда этот код использует if-else , он становится довольно неприятным ... есть ли другой способ сделать это.

Вот мой фрагмент кода

if(current->left==NULL && current->right==NULL && current->key<prev->key)   //left leaf
prev->left=NULL;
else if(current->left==NULL && current->right==NULL && current->key>prev->key) // right     leaf
prev->right=NULL;
else if(current->left!=NULL && current->right==NULL && current->key<prev->key) // left     child with one child
prev->left=current->left;
else if(current->left==NULL && current->right!=NULL && current->key<prev->key)
prev->left=current->right;
else if(current->left!=NULL && current->right==NULL && current->key>prev->key)
prev->right=current->left;
else if(current->left==NULL && current->right!=NULL && current->key>prev->key)
prev->right=current->left;
else if(current->left!=NULL && current->right!=NULL)
{
    check=current->right;
    check1=check;
    while(check->left!=NULL)
    {
    check1=check;
    check=check->left;
    }
    *current=*check;
    check1->left=NULL;
}
0
задан Brian Tompsett - 汤莱恩 29 August 2015 в 18:24
поделиться