home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.disi.unige.it
/
2015-02-11.ftp.disi.unige.it.tar
/
ftp.disi.unige.it
/
pub
/
.person
/
CataniaB
/
teach-act
/
esempi
/
Tipi_di_dato
/
Alberi
/
bstrees.c
next >
Wrap
C/C++ Source or Header
|
1997-05-15
|
2KB
|
97 lines
#include<stdio.h>
#include "trees.h"
void insert(int x,tree *T);
/* inserisce x nell'albero T (passaggio x rif) */
tree search(int x,tree T);
/* restituisce un puntatore al nodo con etichetta x */
void delete(int x,tree *T);
/* cancella x da T */
main()
{
tree R,S,T;
int i,x;
/* inserisce in un albero (ordinato) e calcola la sua altezza */
for (i=0;i<10;scanf("%d",&x),insert(x,&R),i++);
bfs(R);
printf("\n Altezza albero %d",length(R));
/* cancello un elemento */
printf("\n Delete: which one?");
scanf("%d",&x);
delete(x,&R);
/* stampo l'albero */
bfs(R);
/* cerco un elemnto */
printf("\n Find: which one?");
scanf("%d",&x);
printf("Found? %d",(search(x,R)!=NULL)?1:0);
/* oss: search restituisce un puntatore! */
}
void insert(int x,tree *T)
{
if (is_empty_tree(*T))
*T=maketree(x,emptytree(),emptytree());
else if (x<root(*T))
insert(x,&(*T)->left);
else if (root(*T)<x)
insert(x,&(*T)->right);
}
tree search(int x,tree T)
/* cerca l'etich. x nell'albero e restituisce un puntatore al nodo che la contiene */
{
if (is_empty_tree(T))
return NULL;
if (x==root(T))
return T;
else if (x<root(T))
return search(x,T->left);
else if (x>root(T))
return search(x,T->right);
}
int deletemin(tree *T)
/* T non e' vuoto per ipotesi (vedi proc. "delete" ) cancello nodo con etichetta di valore minimo
(quello + a sx) da T */
{
int min;
if (is_empty_tree((*T)->left))
{
min=root(*T);
*T=(*T)->right;
return min;
}
else return deletemin(&(*T)->left);
}
void delete(int x,tree *T)
/* cancello nodo con etichetta x da T: vari casi*/
{
if (!is_empty_tree(*T))
if (root(*T) >x)
delete(x,&(*T)->left); /* */
else if (root(*T) <x) /* non ho ancora trovato x: scendo nell'albero */
delete(x,&(*T)->right); /* */
else if (is_empty_tree((*T)->left)) /* ho trovato x e il suo figlio sx e' NULL */
*T=(*T)->right;
else if (is_empty_tree((*T)->right)) /* " " " dx " */
*T=(*T)->left;
else (*T)->root=deletemin(&(*T)->right); /* " " e i figli non sono vuoti sostituisco */
/* x con il minimo del sottoalbero destro (non vuoto) */
}