Copac N-ari

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

În informatică, un copac n-ari este un copac ale cărui noduri au, cel mult, gradul n ; prin arbore ne referim la un grafic nedirectat , conectat și aciclic. Este o structură de date utilizată pe scară largă în domeniul IT.

Conform caracterelor comune ale copacului, are un nod numit rădăcină (sau rădăcină ), care poate avea un număr de copii egal sau mai mic decât aritatea copacului. Nodurile fără copii se numesc frunze și toate celelalte sunt numite noduri interne. Cele n noduri copil ale aceluiași părinte se numesc frați .
O secvență de noduri și ramuri astfel încât fiecare nod (cu excepția ultimului) este părintele următorului se numește cale . Numărul de arce (sau ramuri ) implicate într-o cale se numește lungimea căii . În general, o cale cu noduri K are margini K-1 , adică are lungime K-1 . Lungimea celui mai lung traseu de la un nod la o frunză se numește înălțimea nodului ; toate frunzele au o înălțime de 0, iar părinții frunzelor, o înălțime de 1.
Dacă T este un copac și X este un nod al acestuia, setul de noduri ale lui T care conține X și toți descendenții săi se numește subarborele lui T. X este numit rădăcina subarborelui .

Implementarea copacilor n-ari

Prin utilizarea structurilor de programare generice, este posibil să se dea diferite implementări copacilor n-ari. Una dintre cele mai frecvente pentru această structură de date, care poate fi implementată utilizând unul dintre multele limbaje de programare , este prima implementare dinamică copil-frate , convenabilă, deoarece nu ține cont de numărul de copii pe care îi poate avea un nod.
În această implementare, fiecare nod are întotdeauna și doar două referințe:

  • la primul copil (stânga)
  • către primul frate (dreapta)

Mai jos, câteva exemple ale acestor implementări.

Primul exemplu de implementare copil-frate

Prima implementare frate-copil

Iată codul sursă Java al unei implementări cu vizite de pre-comandă și post-comandă :

  
clasa NTreeNode < E > // implementare nod arbore cu tip E generic
{ 
	NTreeNode protejat firstChild ; //primul fiu
	frate protejat NTreeNode ; //frate
	element E protejat ; // elementul nodului
	public NTreeNode () // constructor
	{
		aceasta ( nul , nul , nul );
	}
	NTreeNode public ( element E , NTreeNode firstChild )
	{
		this ( element , firstChild , nul );
	}
	NTreeNode public ( element E , NTreeNode firstChild , NTreeNode frate )
	{
		aceasta . element = element ;
		aceasta . firstSon = firstChild ;
		aceasta . frate = frate ;
	}
	public String toString () {
		element return ( String ) ;
	}
}
public class NTree // public class tree
{
	rădăcină NTreeNode protejată ; // rădăcina arborelui
	dimensiunea int protejată ; // variabilă pentru dimensiunea arborelui
	public NTree () // constructor
	{
		rădăcină = nul ;
		dimensiune = 0 ;
	}
	insert boolean public ( părinte NTreeNode , NTreeNode [] copii ) // metodă pentru inserare
	{
		if ( this . search ( parent ) && children . length ! = 0 )
		{
			NTreeNode temp = aceasta . searchNode ( părinte );
                        temp . firstChild = children [ 0 ] ;
			for ( int i = 1 ; i < children . length ; i ++ )
				temp = temp . frate = copii [ i ] ;
                        întoarce-te adevărat ;
		}
		altceva
			Sistem . afară . println ( "Eroare, nodul nu există. Nu se pot introduce noduri copil" );
		// eroare de imprimare
                returnează fals ;
	}
	căutare publică booleană ( nod NTreeNode ) // metodă de căutare a unui nod
	{
		NTreeNode p = aceasta . rădăcină;
		if ( p ! = nul ) {
			if ( p == nod ) returnează true ;
			altceva
			{
				NTreeNode t = p . firstChild ;
				while ( t ! = nul )
				{
					căutare ( t );
					t = t . frate ;
				}
			}
		}
		returnează fals ;
	}
	publice TNodeList searchNode (TNodeList nod)
	{
		TNodeList p = aceasta . rădăcină;
		if ( p ! = nul ) {
			if ( p == nod ) returnează p ;
			altceva
			{
				TNodeList t = p . copii . cap ;
				while ( t ! = nul )
				{
					căutare ( t );
					t = t . următor ;
				}
			}
		}
		returnare nulă ;
	}
	public void preorder () {
		preordonare ( rădăcină );
	}
	precomandă de vid public ( NTreeNode p ) {
		if ( p ! = nul ) {
			Sistem . afară . println ( p . toString ());
			NTreeNode t = p . firstChild ;
			while ( t ! = nul ) {
				precomandă ( t );
				t = t . frate ;
			}
		}
	}
	public void postorder () {
		postorder ( rădăcină );
	}
	public postorder nul ( NTreeNode p ) {
		if ( p ! = nul ) {
			NTreeNode t = p . firstChild ;
			while ( t ! = nul ) {
				postorder ( t );
				t = t . frate ;
			}
		Sistem . afară . println ( p . toString ());
	        }
	}
}

Implementarea listei legate

Mai jos, o altă implementare foarte populară a copacilor n-ari, de data aceasta folosind liste legate . Limbajul de programare ales pentru această implementare este Java.

Exemplu de implementare cu listă legată
 clasa TNodeList < E >
{
	element E public ;
	public TNodeList următor ;
	copii publici LinkedList ;
	TNodeList public ( element E )
	{
		children = new LinkedList ();
		aceasta . element = element ;
	}
	public String toString ()
	{
		returnează ( String ) acest lucru . element ;
	}
}
clasă LinkedList
{
	TNodeList cap , coadă ;
	dimensiunea int ;
	public LinkedList () {
		cap = coadă = nul ;
		dimensiune = 0 ;
	}
	public void addFirst ( nodul TNodeList )
	{
		if ( head == nul ) {
			cap = coadă = nod ;
		}
		altceva
		{
			nod . next = cap ;
			cap = nod ;
		}
		dimensiune ++ ;
	}
	public void addLast ( nodul TNodeList )
	{
		if ( tail == nul )
		{
			cap = coadă = nod ;
		}
		altceva
		{
			coada . next = nod ;
			coada = nod ;
		}
		dimensiune ++ ;
	}
}
clasă publică NTL
{
	rădăcină publică TNodeList ;
	dimensiunea publică int;
	NTL public ( rădăcină TNodeList )
	{
		aceasta . rădăcină = rădăcină ;
		dimensiune = 0 ;
	}
	insert boolean public ( TNodeList [] copii , părinte TNodeList )
	{
		if ( this . search ( parent ))
		{
			TNodeList tmp = aceasta . searchNode ( părinte ); 
			if ( copii . lungime ! = 0 )
			{
				for ( int i = 0 ; i < children . length ; i ++ )
				{
					părinte . copii . addLast ( copii [ i ] );
				}
				întoarce-te adevărat ;
			}
			altceva 
			{
				Sistem . afară . println ( „Fără copii de inserat” );
				returnează fals ;
			}
		}
		Sistem . afară . println ( "Nodul părinte nu există" );
		returnează fals ;
	}
	căutare booleană publică ( nod TNodeList )
	{
		dacă ( dimensiune ! = 0 )
		{
			TNodeList p = aceasta . rădăcină;
			if ( p ! = nul )
			{
				if ( p == nod ) returnează true ;
				altceva
				{
					TNodeList t = p . copii . cap ;
					while ( t ! = nul )
					{
						căutare ( t );
						t = t . următor ;
					}
				}
			}
		}
		returnează fals ;
	}
	publice TNodeList searchNode (TNodeList nod)
	{
		TNodeList p = aceasta . rădăcină;
		if ( p ! = nul ) {
			if ( p == nod ) returnează p ;
			altceva
			{
				TNodeList t = p . copii . cap ;
				while ( t ! = nul )
				{
					căutare ( t );
					t = t . următor ;
				}
			}
		}
		returnare nulă ;
	}
        public void preorder () {
		preordonare ( rădăcină );
	}
	precomandă de vid public ( TNodeList p ) {
		if ( p ! = nul ) {
			Sistem . afară . println ( p . toString ());
			TNodeList t = p . copii . cap ;
			while ( t ! = nul ) {
				precomandă ( t );
				t = t . următor ;
			}
		}
	}
	public void postorder () {
		postorder ( rădăcină );
	}
	void postordine publice (TNodeList p) {
		if ( p ! = nul ) {
			TNodeList t = p . copii . cap ;
			while ( t ! = nul ) {
				postorder ( t );
				t = t . următor ;
			}
		Sistem . afară . println ( p . toString ());
	        }
}

Elemente conexe

Informatică Portal IT : accesați intrările Wikipedia care se ocupă cu IT