usuwanie wezla o kluczu k drzewo BST

0

witam
program jest jeszcze nie kompletny, poniewaz nie ma przypadku gdy wezel ma jednego potomka. nie wiem czemu ale zawiesza mi sie dla dwoch. czy mógłby ktos wskazac błąd. za kazda pomoc jestem wdzieczny
kod

typedef struct drzewo{
       int klucz;
      struct drzewo *left,*right,*top;
       
}drzewo;


drzewo *znajdz(drzewo *root, int k){
       drzewo *x=root;
       while((x)&&(x->klucz!=k)){
       if(x->klucz>k)x=x->left;
       else x=x->right;
                }
       
       return x;
       }


drzewo *pop(drzewo *root, int a ){
    drzewo *wsk=znajdz(root,a);
    if(wsk->left!=NULL){wsk=wsk->left;while(wsk->right!=NULL)wsk=wsk->right;
    
                        }
    else{wsk=wsk->top;
         while(wsk->klucz<a)wsk=wsk->top;
                             }
         
         
    return wsk;
    
      }
drzewo *nast(drzewo *root, int a){
       
       drzewo *wsk=znajdz(root,a);
       if(wsk->right!=NULL)
                            {wsk=wsk->right; 
                             while(wsk->left!=NULL)wsk=wsk->left;}
      
       else 
      {wsk=wsk->top;
       while(wsk->klucz<a)wsk=wsk->top;
                                       }  
                            
       
       
       
       
       return wsk;
       
       }
  
void usun(drzewo *&root, int a  ){
     drzewo *x=znajdz(root,a);
     if((x->right==NULL)&&(x->left==NULL)){
                                           if(x->top->right==x)x->top->right=NULL;
                                           else x->top->right=NULL;
                                           free(x);
                                           
                                           }
else if((x->left!=NULL)&&(x->right!=NULL)){
     drzewo *y;
     if(x->top->right==x){y=nast(root,a);
     y->top->left=NULL;
     y->top=x->top;
     x->top->right=y;
     y->right=x->right;
     y->left=y->left;
     x->left->top=y;
     x->right->top=y;
                          
               free(x);           
                          
                          }
     
     else{y=pop(root,a);
     y->top->right=NULL;
     y->top=x->top;
     x->top->right=y;
     y->right=x->right;
     y->left=y->left;
     x->left->top=y;
     x->right->top=y;
          free(x);
          
          }
     
     }}

 

dziekuje i pozdrawiam

pomoze ktos?

0

Odpal pod debugerem i zobaczysz gdzie się "zawiesza".

0

tu masz teorię http://pl.wikipedia.org/wiki/Binarne_drzewo_poszukiwań#Usuwanie_klucza
Weź sobie jakieś IDE, visual c++, czy eclipse i zdebuguj to.
Jak dalej nie będziesz wiedział daj znać to wieczorem sformatuje sobie ten twój kod i zobaczę o co chodzi, zaraz idę do domu :]

0

dzieki za odpowiedzi. neistety ale nie wie czemu wisual mocno mi muli, wiec jezeli mozesz to rzuc na moj kod okiem, on jest bez main'a oczywiscie. jezeli chodzi o algorytm to staralem sie napisac cos samemu a nie zrzynać z ksiazki. jezeli robie cos nie tak przy przekazywaniu wskaznikow lub iine blad bylbym wdzieczny gdybys mi go wskazal i wytlumaczyl jak go unikac w przyszlosci

dziekuje raz jeszcze i pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1