You are on page 1of 7

Arbori

Probleme
1. Se citeste un arbore cu n varfuri dat prin vectorul TATA.
a) Sa se afiseze muchiile arborelui
b) Sa se construiasca si sa se afiseze matricea de adiacenta a arborelui.
#include<iostream.h>
int n, T[100], a[100][100];
void afis()
{ int i,j;
for(i=1;i<=n;i++)
{ for(j=1;j<=n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
}
void main()
{ int i;
cin>>n;
for(i=1;i<=n;i++) cin>>T[i];
for(i=1;i<=n;i++)
if(T[i]!=0)
{ cout<<"["<<T[i]<<","<<i<<"] ";
a[i][T[i]]=a[T[i]][i]=1;
}
cout<<endl;
afis(); return 0;
}
2. Se citeste un arbore cu n varfuri dat prin vectorul muchiilor si apoi se citeste varful
radacina. Sa se construiasca si sa se afiseze vectorul TATA.
#include<iostream.h>
int n, r, T[100], a[100][100], p[100];
void citire()
{ int i,x,y;
cin>>n;
for(i=1;i<=n-1;i++)
{ cin>>x>>y;
a[x][y]=a[y][x]=1;}
cin>>r;
}
void BF(int r)
{ int s,d,i,x[100];
d=s=1;
x[1]=r; p[r]=1;
while (s<=d)

{ for(i=1;i<=n;i++)
if(a[x[s]][i] &&!p[i])
{ d++; x[d]=i;
p[i]=1; T[i]=x[s];
}
s++;
}
}
void main()
{ int i;
citire();
BF(r);
for(i=1;i<=n;i++) cout<<T[i]<<" ";
}
3. Se citeste un arbore cu n varfuri dat prin vectorul TATA. Sa se afiseze frunzele arborelui.
#include<iostream.h>
int n, T[100], p[100];
void main()
{ int i;
cin>>n;
for(i=1;i<=n;i++)
{ cin>>T[i];
p[T[i]]=1;
}
for(i=1;i<=n;i++)
if(!p[i]) cout<<i<<" ";
}
4. Se citeste un arbore cu n varfuri dat prin vectorul TATA.
a) Sa se afiseze gradele varfurilor.
b) Sa se afiseze pentru fiecare varf nivelul pe care se afla (numerotarea nivelelor incepe de la
0-radacina).
#include<iostream.h>
int n,r, T[100], D[100], p[100], niv[100];
void afis()
{ for(int i=1;i<=n;i++) cout<<D[i]<<" ";
cout<<endl;
for(i=1;i<=n;i++) cout<<niv[i]<<" ";
}
void df(int r)
{for(int i=1;i<=n;i++)
if(T[i]==r && !p[i])
{ p[i]=1;
niv[i]=niv[r]+1;
df(i);
}
}

void main()
{ int i;
cin>>n;
for(i=1;i<=n;i++)
{
cin>>T[i];
if(T[i]!=0) { D[i]++;
D[T[i]]++;
}
}
for(i=1;i<=n;i++)
if(T[i]==0) r=i;
niv[r]=0;
df(r);
afis();
}
5. Se citeste o padure cu n varfuri prin vectorul de tati. Sa se determine din cati arbori este
formata padurea.
#include<fstream.h>
#include<iostream.h>
ifstream f("date.in");
ofstream g("date.out");
int t[100],n;
void citire()
{f>>n;
for(int i=1;i<=n;i++)
f>>t[i];
}
void main()
{citire();
int k=0;
for(int i=1;i<=n;i++)
if(t[i]==0) k++;
g<<k<<" ";
f.close();g.close();return 0;
}
6. Din fisierul sd.in se citeste un numar natural n reprezentand numarul de varfuri ale unui
arbore binar si apoi vectorii S si D pentru descendentii fiecarui nod din arbore.
a) Sa se parcurga arborele in preordine, inordine si postordine.
b) Sa se parcurga arborele pe nivele
c) Sa se calculeze si sa se afiseze inaltimea arborelui.
#include<fstream.h>
#include<iostream.h>
ifstream f("sd.in");
ofstream g("arb.out");
int S[100],D[100],P[100],r,n,i,maxx;

void RSD(int n)
{g<<n<<" ";
if(S[n]) RSD(S[n]);
if(D[n]) RSD(D[n]);
}
void SRD(int n)
{if(S[n]) SRD(S[n]);
g<<n<<" ";
if(D[n]) SRD(D[n]);
}
void SDR(int n)
{if(S[n]) SDR(S[n]);
if(D[n]) SDR(D[n]);
g<<n<<" ";
}
void BF(int r)
{int x[100],i,j;
i=1;j=i;
x[1]=r;
while(i<=j) {if(S[x[i]]) x[++j]=S[i];
if(D[x[i]]) x[++j]=D[i];
i++;}
for(i=1;i<=n;i++) g<<x[i]<<" ";
}
void adancime(int n, int niv)
{if(niv>maxx) maxx=niv;
if(S[n]) adancime(S[n],niv+1);
if(D[n]) adancime(D[n],niv+1);
}
int main()
{f>>n;
for(i=1;i<=n;i++) P[i]=0;
for(i=1;i<=n;i++)
{f>>S[i];
P[S[i]]=1;
}
for(i=1;i<=n;i++)
{fin>>D[i];
P[D[i]]=1;
}
for(i=1;i<=n;i++)
if(P[i]==0) r=i;
g<<"Preordine: ";RSD(r);g<<endl;
g<<"Inordine: ";SRD(r);g<<endl;
g<<"Postordine: ";SDR(r);g<<endl;
g<<"Pe nivele: ";BF(r);g<<endl;
g<<"Adancimea: "; adancime(r,0);g<<maxx;
f.close();g.close();return 0;
}

7. Arbore partial de cost minim (cu algoritmul lui Prim).


#include<fstream.h>
#include<iostream.h>
ifstream f("k.in");
ofstream g("k.out");
const int inf=1<<20;
int n,m,A[100][100],P[100];
void citire()
{ int i,j,k,c;
f>>n>>m;
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
A[i][j]=A[j][i]=inf;
for(int k=1;k<=m;k++)
{ fin>>i>>j>>c;
A[i][j]=A[j][i]=c;
}
}
int main()
{ int i,k,minn,x;
citire();
for(i=2;i<=n;i++) P[i]=1;
for(k=1;k<n;k++)
{
minn=inf;
for(i=1;i<=n;i++)
if(P[i] && A[P[i]][i]<minn)
{
minn=A[P[i]][i]; x=i;
}
g<<P[x]<<" "<<x<<" "<<A[P[x]][x]<<endl;
for(i=1;i<=n;i++)
if(P[i] && A[P[i]][i]>A[i][x])
P[i]=x;
P[x]=0;
}
f.close();g.close();return 0;
}
8. Arbore partial de cost minim (cu algoritmul lui Kruskal).
#include<fstream.h>
#include<iostream.h>
ifstream f("k.in");
ofstream g("k.out");
struct muchie{int x,y,c;};
muchie V[100];
int n,m,A[100][100],P[100],k;
void citire()

f>>n>>m;
for(int i=1;i<=m;i++)
f>>V[i].x>>V[i].y>>V[i].c;

}
void colorare(int r,int cul)
{ int s,d,i,X[100];
s=d=1;
X[1]=r;
P[r]=1;
while(s<=d)
{for(int i=1;i<=n;i++)
if(P[i]!=cul && A[X[s]][i])
{d++; X[d]=i; P[i]=cul;
}
s++;
}
}
void ordonare()
{ muchie aux;
for(int i=1;i<m;i++)
for(int j=i+1;j<=m;j++)
if(V[i].c>V[j].c)
{aux=V[i];
V[i]=V[j];
V[j]=aux;
}
}
int main()
{ int i;
citire();
for(i=1;i<=n;i++) P[i]=i;
ordonare();
k=0; i=1;
while(k<n-1)
{if(P[V[i].x]!=P[V[i].y])
{g<<V[i].x<<" "<<V[i].y<<" "<<V[i].c<<"\n";
A[V[i].x][V[i].y]=A[V[i].y][V[i].x]=1;
if(P[V[i].x]<P[V[i].y]) colorare(V[i].y,P[V[i].x]);
else colorare(V[i].x,P[V[i].y]);
k++;
}i++;
}
f.close();g.close();return 0;
}
9. Se citeste un numar natural n. Construiti un arbore cu proprietatea ca fiecare varf are
numarul de descendenti directi cu 1 mai mare decat nivelul pe care se afla. Exceptie fac
frunzele si nodul pentru care se termina cele n varfuri. Astfel, radacina (aflata pe nivelul 0)
are un singur descendent direct, varful de pe nivelul 1 are 2, cele de pe nivelul 2 au cate trei,
etc. Arborele va fi reprezetat prin vectorul legaturilor de tip tata.

#include<fstream.h>
#include<iostream.h>
int t[100],n, inf=15000;
ifstream f("date.in");
ofstream g("date.out");
int main()
{ int v,k,niv,p,i;
f>>n;
t[1]=0;p=1;
niv=1;
k=2;
v=1;
while(k<=n)
{p=p*niv;
for(i=1;i<=p && k<=n;i++)
{ t[k++]=v;
if(i%niv==0) v++;
}
niv++;
}
for(i=1;i<=n;i++) g<<t[i]<<" ";
f.close();g.close();return 0;
}
10. Se da un arbore binar cu n noduri prin vectorii de descendenti S si D. Afisati pe randuri
separate: - frunzele arborelui
- varfurile cu un singur descendent direct
- varfurile cu doi descendenti directi
#include<iostream.h>
#include<fstream.h>
ifstream f("date.in");
ofstream g("date.out");
int i,n,S[100],D[100];
int main()
{
f>>n;
for(i=1;i<=n;i++)
f>>S[i]>>D[i];
g<<"frunzele: ";
for(i=1;i<=n;i++)
if(S[i]==0 && D[i]==0) g<<i<<" ";
g<<"\nvarfurile cu un singur descendent: ";
for(i=1;i<=n;i++)
if(S[i]*D[i]==0 && S[i]+D[i]!=0) g<<i<<" ";
g<<"\nvarfurile cu doi descendenti: ";
for(i=1;i<=n;i++)
if(S[i] && D[i]) g<<i<<" ";
f.close();g.close();return 0;
}