Albero binario

di il
3 risposte

Albero binario

Salve, ho scritto questo programma per la gestione di un albero binario ma la ricerca da sempre esito negativo anche quando l'elemento esiste. Posto il codice nella speranza che qualcuno mi aiuti

binarytree.cpp
#include <iostream>
#include <cstddef>
#include "Tree.h"
using namespace std;

int main() {
	Tree a;
	char c;
		while(c!='4'){
			cout<<"Inserisci 1 per inserire un valore nell'albero\n 2 per cercarne un valore\n";
			cout<<"3 per distruggere un valore e tutti i suoi rami\n 4 per uscire";
			cin>>c;
			if(c=='1'){
									int n;
									cout<<"Inserisci il valore numerico da immettere";
									cin>>n;
									if(a.root==NULL)
										a.firstInsert(n);
									else
										a.insert(n,a.root);
								}
			if(c=='2'){
									int n;
									cout<<"Inserisci il valore numerico da cercare";
									cin>>n;
									a.search(n,a.root,a.found);
									if(a.found==NULL)
										cout<<"Elemento non trovato";
								}
			if(c=='3'){
									int n;
									cout<<"Inserisci il valore numerico da eliminare con tutti i suoi rami";
									cin>>n;
									a.search(n,a.root,a.found);
									if(a.found==NULL)
										cout<<"Elemento non trovato";
									else
									a.destroy_tree(a.found);
								}
		}
	return 0;
}
tree.h
#ifndef TREE_H_
#define TREE_H_

#include <cstddef>
class Tree {
private:
	 	 struct node{
			node *right;
			node *left;
			int data;
	    	};

public:
		 Tree(){
			root = NULL;
			found = NULL;
		 }
		 node *root;

			 	 void firstInsert(int);
	void destroy_tree(node*);
    void insert(int, node*);
    void search(int, node*,node*);
    node *found;
};

#endif /* TREE_H_ */
tree.cpp
#include "Tree.h"
#include <cstddef>
#include <iostream>

void Tree::destroy_tree(node *leaf){
	if(leaf!=NULL){
		Tree::destroy_tree(leaf->left);
		Tree::destroy_tree(leaf->right);
		delete leaf;
	}
}

void Tree::insert(int v, node *leaf){
if ( leaf == NULL ) {
node *ptr = new node;
ptr->data = v;
ptr->left = NULL;
ptr->right = NULL;
leaf = ptr;}
else {
	if (v == leaf->data)//se l'elemento già esiste nonva inserito niente
;
	else{
if ( v < leaf->data ) {
insert ( v, leaf->left );
}
else{
insert ( v, leaf->right );
}
}
}
}

void Tree::firstInsert(int v){
	node *ptr = new node;
	ptr->data = v;
	ptr->left = NULL;
	ptr->right = NULL;
	root = ptr;}

void Tree::search(int key, node *leaf, node* found){
  if(leaf!=NULL){
    if(key==leaf->data)
      found = leaf;
    if(key<leaf->data)
      search(key, leaf->left, found);
    else
      search(key, leaf->right, found);
  }
  else found = NULL;
}
Grazie anticipatamente per l'attenzione

3 Risposte

  • Re: Albero binario

    Ma hai fatto un po' di debugging eseguendo passo passo il codice della ricerca?

    E' bastato un minuto per trovare i problemi ...
  • Re: Albero binario

    Non capisco
    Se quel nodo è nullo dato che parte dal nodo root significa che non c'è niente e nemmeno quello che si cerca. Se invece trova qualcosa lo mette in found se è quello che si cerca seno itera la ricerca su due rami a seconda se è maggiore o minore
    Dov'è il problema?
  • Re: Albero binario

    Ti ripeto la mia domanda ...

    Ho inserito 3 valori e quando esamino l'albero a partire da root ottengo che solo il primo valore è impostato correttamente mentre i puntatori sinistra e destra sono nulli.

    Quindi

    1) l'inserimento è sbagliato

    Inoltre, anche cercando il singolo valore inserito in root, non viene trovato

    2) la ricerca è sbagliata

    Per la ricerca, controlla il flusso delle if, nel caso in cui il valore venga trovato ...
    In ogni caso

    a) è meglio rendere root private e accedere tramite appositi metodi

    b) passa il puntatore dell'oggetto a alle funzioni
Devi accedere o registrarti per scrivere nel forum
3 risposte