actualizarea valorii cheii nodului în BST

voturi
0
template <class T>
void BinaryTree<T>::UpdateKey(T newkey,T oldkey)
{
     TreeNode<T> *temp,*temp1,*temp2,*temp3;
     temp=Root;
      //checking to see if the new value clashes with any existing value
     while (temp!=NULL)
     {
         if (temp->key==newkey)
         {
            cout<<New key already exists in the tree.CannotUpdate!;                  
            cout<<endl;                 
            return;
         }
         if (newkey>temp->key)
         {
            temp=temp->RightChild;
         }
         else if (newkey<temp->key)
         {
            temp=temp->LeftChild;
         }
     }

     temp=Root;                                  
     while (temp!=NULL)
     {      
         if (temp->key==oldkey)
         {
             temp1=temp->Parent;
             temp->key=newkey;
             if (temp1->LeftChild==temp)  //if the node is the left child of its parent
             {
                 if (temp1->key<temp->key)
                 {
                     //move to right child of node whose key has to be changed and  
                    //then keep on moving to the LeftChild of every node until last 
                     //node is reached and exchange the key/value 
                     temp=temp->RightChild;                     
                     while (temp->LeftChild!=NULL)
                     {
                         temp=temp->LeftChild;
                     }
                     //exchanging key/value of the two nodes
                     temp2=temp;
                     temp3=temp1->LeftChild;
                     temp->key=temp3->key;
                     temp->value=temp3->value;
                     temp3->key=temp2->key;
                     temp3->value=temp2->value;
                 }
                 cout<<Value updated successfully1<<endl;
                 return;
             }
             //if the node is right child of its parent
             else if (temp1->RightChild==temp)
             {
                   //if key of parent is greater than its right child
                  if (temp1->key>temp->key)
                  {
                  //move to the leftchild of the node whose value has to change
                  //and then keep moving to right child until the last node
                      temp=temp->LeftChild;
                      while (temp->RightChild!=NULL)
                      {
                          temp=temp->RightChild;
                      }
                     //exchange value/key of the last node with the node whose value
                      //is updated
                      temp2=temp;
                      temp3=temp1->RightChild;
                      temp->key=temp3->key;
                      temp->value=temp3->value;
                      temp3->key=temp2->key;
                      temp3->value=temp2->value;                  
                  }     
                  cout<<Value updated successfully2<<endl;
                                                                                                             return;     
             }                  
             //comparing newkey with the left child to see if its less than the latter
             if (temp->LeftChild!=NULL && newkey<(temp->LeftChild)->key)
             {

                 temp->key=newkey;                 
                 temp1=temp;        
                 temp=temp->LeftChild;
                 while (temp->RightChild!=NULL)
                 {
                     temp=temp->RightChild;
                 }           
                 temp2=temp1;                            
                 temp1->key=temp->key;
                 temp1->value=temp->value;
                 temp->key=temp2->key;
                 temp->value=temp2->value;

                 cout<<Value updated successfully3<<endl;
                 return;
             }
             //comparing with the right child if it is greater than the latter
             //and moving key/value to the right spot if condition is met
             else if (temp->RightChild!=NULL && newkey>(temp->RightChild)->key)
             {
                 temp->key=newkey;
                 temp1=temp;
                 while (temp->LeftChild!=NULL)
                 {
                     temp=temp->LeftChild;
                 }
                 temp2=temp1;                            
                 temp1->key=temp->key;
                 temp1->value=temp->value;
                 temp->key=temp2->key;
                 temp->value=temp2->value; 

                cout<<Value updated successfully4<<endl;
                return;
             }

         }
         //traversing the tree by comparing oldkey with node key and going in the right
         //direction
         if (oldkey<temp->key)
             temp=temp->LeftChild;
         else if (oldkey>temp->key)
            temp=temp->RightChild;    
     }
}

Am construit copacul BST folosind un fișier care are un șir de caractere , urmat de un număr și astfel încât nodurile să aibă o cheie / valoare pair.The problemă este atunci când am actualiza nodul ( de exemplu , schimbarea cheii nodului și rearanjarea nodul astfel încât este în poziția corectă pe copac), nu corect dau cheia pentru că atunci când am căuta acea cheie (folosind funcția de căutare; funcţia mea de căutare este de lucru bine, am testat bine), nu primesc nici de potrivire cheie în tree.I au luat deja ajutor pentru alte funcții și pot fi găsite aici:
binar Arborele de căutare - funcția de ștergere nu funcționează

Întrebat 26/02/2013 la 19:04
sursa de către utilizator
În alte limbi...                            


1 răspunsuri

actualizarea valorii cheii nodului în BST

voturi
0
template <class T>
void BinaryTree<T>::UpdateKey(T newkey,T oldkey)
{
     TreeNode<T> *temp,*temp1,*temp2,*temp3;
     temp=Root;
      //checking to see if the new value clashes with any existing value
     while (temp!=NULL)
     {
         if (temp->key==newkey)
         {
            cout<<"New key already exists in the tree.CannotUpdate!";                  
            cout<<endl;                 
            return;
         }
         if (newkey>temp->key)
         {
            temp=temp->RightChild;
         }
         else if (newkey<temp->key)
         {
            temp=temp->LeftChild;
         }
     }

     temp=Root;                                  
     while (temp!=NULL)
     {      
         if (temp->key==oldkey)
         {
             temp1=temp->Parent;
             temp->key=newkey;
             if (temp1->LeftChild==temp)  //if the node is the left child of its parent
             {
                 if (temp1->key<temp->key)
                 {
                     //move to right child of node whose key has to be changed and  
                    //then keep on moving to the LeftChild of every node until last 
                     //node is reached and exchange the key/value 
                     temp=temp->RightChild;                     
                     while (temp->LeftChild!=NULL)
                     {
                         temp=temp->LeftChild;
                     }
                     //exchanging key/value of the two nodes
                     temp2=temp;
                     temp3=temp1->LeftChild;
                     temp->key=temp3->key;
                     temp->value=temp3->value;
                     temp3->key=temp2->key;
                     temp3->value=temp2->value;
                 }
                 cout<<"Value updated successfully1"<<endl;
                 return;
             }
             //if the node is right child of its parent
             else if (temp1->RightChild==temp)
             {
                   //if key of parent is greater than its right child
                  if (temp1->key>temp->key)
                  {
                  //move to the leftchild of the node whose value has to change
                  //and then keep moving to right child until the last node
                      temp=temp->LeftChild;
                      while (temp->RightChild!=NULL)
                      {
                          temp=temp->RightChild;
                      }
                     //exchange value/key of the last node with the node whose value
                      //is updated
                      temp2=temp;
                      temp3=temp1->RightChild;
                      temp->key=temp3->key;
                      temp->value=temp3->value;
                      temp3->key=temp2->key;
                      temp3->value=temp2->value;                  
                  }     
                  cout<<"Value updated successfully2<<endl;
                                                                                                             return;     
             }                  
             //comparing newkey with the left child to see if its less than the latter
             if (temp->LeftChild!=NULL && newkey<(temp->LeftChild)->key)
             {

                 temp->key=newkey;                 
                 temp1=temp;        
                 temp=temp->LeftChild;
                 while (temp->RightChild!=NULL)
                 {
                     temp=temp->RightChild;
                 }           
                 temp2=temp1;                            
                 temp1->key=temp->key;
                 temp1->value=temp->value;
                 temp->key=temp2->key;
                 temp->value=temp2->value;

                 cout<<"Value updated successfully3"<<endl;
                 return;
             }
             //comparing with the right child if it is greater than the latter
             //and moving key/value to the right spot if condition is met
             else if (temp->RightChild!=NULL && newkey>(temp->RightChild)->key)
             {
                 temp->key=newkey;
                 temp1=temp;
                 while (temp->LeftChild!=NULL)
                 {
                     temp=temp->LeftChild;
                 }
                 temp2=temp1;                            
                 temp1->key=temp->key;
                 temp1->value=temp->value;
                 temp->key=temp2->key;
                 temp->value=temp2->value; 

                cout<<"Value updated successfully4"<<endl;
                return;
             }

         }
         //traversing the tree by comparing oldkey with node key and going in the right
         //direction
         if (oldkey<temp->key)
             temp=temp->LeftChild;
         else if (oldkey>temp->key)
            temp=temp->RightChild;    
     }
}

Am construit copacul BST folosind un fișier care are un șir de caractere , urmat de un număr și astfel încât nodurile să aibă o cheie / valoare pair.The problemă este atunci când am actualiza nodul ( de exemplu , schimbarea cheii nodului și rearanjarea nodul astfel încât este în poziția corectă pe copac), nu corect dau cheia pentru că atunci când am căuta acea cheie (folosind funcția de căutare; funcţia mea de căutare este de lucru bine, am testat bine), nu primesc nici de potrivire cheie în tree.I au luat deja ajutor pentru alte funcții și pot fi găsite aici:
binar Arborele de căutare - funcția de ștergere nu funcționează

Publicat 26/02/2013 la 19:04
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more