Jump to content

Binary Search Tree


koonamipt

Recommended Posts

Boas pessoal, venho aqui postar uma funçao remove de uma árvore binária que não está a remover node nenhum, ja tou de volta disto há horas se alguém me puder dar uma pista agradeço!

Node* BST::remove(int data, Node* n)
{
 Node* buf;
 Node* node = root;
 if( this->isEmpty() )
 {
   cout << "Tree is empty." << endl;
   return NULL;
 }
 if(data < node->data)
 {
   node->left = remove(data, node->left);
 }
 else if (data > node->data)
 {
   node->right = remove(data, node->right);
 }
 else //data == node->data
 {
   buf = node; //node to delete
   cout << "|buf value -> " << buf->data;
   if(node->right != NULL)//if node has right child
   {
     if(node->right->left != NULL)
     {
       node = findLeftNode(node->right);
       node->right = buf->right;
       node->left = buf->left;
     }
     else
     {
       //ajustar nos directamente nesta funcao
       node = node->right;
       node->left = buf->left;
     }
   }
   else if(node->left != NULL) //if node has left child
   {
     if(node->left->right != NULL)
     {
       node = findRightNode(node->left);
       node->right = buf->right;
       node->left = buf->left;
     }
     else
     {
       node = node->left;
       node->right = buf->right;
     }
   }
   else //node has no children
   {
    //no connections to be made only memory to delete
   }
 }
 cout << "left = " << buf->left << " right = " << buf->right;
 delete buf;
 return node;
}

Tenho a sensação que vou ter de andar a percorrer a árvore um nó atrás do que e suposto apagar e depois fazer as ligações ao nó mais apropriado..Mas talvez não seja esse o único problema.

BTW sou noob em c++ peço desde já perdão se chacinei um bocado a linguagem 😛

Link to comment
Share on other sites

substitui estas linhas:

Node* BST::remove(int data, Node* n)
{
   Node* buf;
   Node* node = root;

por estas:

Node* BST::remove(int data, Node* n=root)
{
   Node* buf;
   Node* node = n;

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

Meti node a apontar para n, agora dá me um erro no windows quando tento apagar um nó.

Fora essas linhas de código as outras pareciam te razoavelmente bem?

Só para acrescentar que só adicionei um nó á árvore portanto o compilador nem entra nos if's.

Ajudava um pouco se dissesses qual foi o erro que deu.

Tens muito codigo desnecessario, mas ja vi piores.

Estas a retornar um node null, o que estas a fazer com ele depois disso?

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

Pre-order: ->1 ->1869762652 ->0 ->6816056 ->1 ->1869762652 ->0 ->6816056 ->1 ->1869762652 ->0 ->6816056 ->1 ->1869762652 ->0 ->6816056 ->1 ->1869762652 ->0......

Inseri 1 na árvore, depois de o apagar dá nisso.

Quanto ao node null vai ser retornado para Node* root; basicamente tenho uma funçao que chama esta que postei, o objectivo era ter uma função sem ser preciso tar a inserir ponteiros etc.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.