Documente Academic
Documente Profesional
Documente Cultură
1.1 Obiective
În lucrare sunt prezentate operaţiile de bază asupra arborilor binari, arbori binari total echilibraţi şi arborilor oarecare.
Construirea unui arbore binar se face conform funcţiei de construire, având următoarea structură:
NodeT *createBinTree()
{
NodeT *p;
char c;
1
1 Arbori binari
#include <stdlib.h>
if ( p != NULL )
{
for ( i = 0; i <= level; i++ )
printf( " " ); /* pentru afisare formatata */
printf( "%2.2d\n", p->id );
preorder( p->left, level + 1 );
preorder( p->right, level + 1 );
}
}
void inorder( NodeT *p, int level )
{
int i;
if ( p != NULL )
{
inorder( p->left, level + 1 );
for ( i = 0; i <= level; i++ )
printf( " " ); /* for nice listing */
printf( "%2.2d\n", p->id );
inorder( p->right, level + 1 );
}
}
void postorder( NodeT *p, int level )
{
int i;
if ( p != NULL )
{
postorder( p->left, level + 1 );
postorder( p->right, level + 1 );
for ( i = 0; i <= level; i++ )
printf( " " ); /* for nice listing */
printf( "%2.2d\n", p->id );
}
}
NodeT *createBinTree( int branch, NodeT *parent )
{
NodeT *p;
int id;
/* read node id */
if ( branch == 0 )
printf( "Root identifier [0 to end] =" );
else
if ( branch == 1 )
printf( "Left child of %d [0 to end] =",
parent->id );
else
printf( "Right child of %d [0 to end] =",
parent->id );
2
1.4 Arbori binari total echilibraţi
scanf("%d", &id);
if ( id == 0 )
return NULL;
else
{ /* construim nodul la care pointeaza p */
p = ( NodeT *)malloc(sizeof( NodeT ));
if ( p == NULL )
fatalError( "Nu mai avem memorie in createBinTree" );
/* fill in node */
p->id = id;
p->left = createBinTree( 1, p );
p->right = createBinTree( 2, p );
}
return p;
}
int main()
{
NodeT *root;
3
1 Arbori binari
* p = current node;
* level = folosit pentru afisare frumoasa
*/
{
int i;
if ( p != NULL )
{
for ( i = 0; i <= level; i++ )
printf( " " ); /* pentru afisare frumoasa */
printf( "%2.2d\n", p->id );
preorder( p->left, level + 1 );
preorder( p->right, level + 1 );
}
}
void inorder( NodeT *p, int level )
{
int i;
if ( p != NULL )
{
inorder( p->left, level + 1 );
for ( i = 0; i <= level; i++ )
printf( " " ); /* pentru afisare frumoasa */
printf( "%2.2d\n", p->id );
inorder( p->right, level + 1 );
}
}
void postorder( NodeT *p, int level )
{
int i;
if ( p != NULL )
{
postorder( p->left, level + 1 );
postorder( p->right, level + 1 );
for ( i = 0; i <= level; i++ )
printf( " " ); /* pentru afisare frumoasa */
printf( "%2.2d\n", p->id );
}
}
NodeT *creBalBinTree( int nbOfNodes )
{
NodeT *p;
int nLeft, nRight;
4
1.5 Arbori oarecare
1. Pentru fiecare nod se citesc in postordine, câmpurile: id, alta informatie utilă 1 , şi numărul de copii, iar această
informaţie se pune pe stivă.
2. Când se citeşte un nod părinte, se scot adresele fiilor din stivă, şi adresele lor sunt trecute în nodul tată, după care
adresa nodului tată este pusă în stivă. În final singura adresă în stivă va fi cea a rădăcinii, arborele fiind construit.
1 dacă e definită