Sei sulla pagina 1di 7

1.

Se dau in fisiereul date.in numerele n, p si q unde n este numarul de noduri ale unui arbore iar p si q sunt
noduri din arbore. Apoi se citeste vectorul de tati prin care este reprezentat arborele. Afisati lantul elementar
de la varful p la varful q.
Exemplu:
date.in
725
4170771
date.out
2175

#include <fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");
int n, t[101],p,q;
void schimba(int r)
{
if(t[r]!=0)
{
schimba(t[r]);
t[t[r]]=r;
}
}
void drum(int v)
{
if(v!=0)
{
drum(t[v]);
fout<<v<<" ";
}
}
int main()
{
fin>>n>>p>>q;
for(int i=1;i<=n;i++) fin>>t[i];
schimba(p);
t[p]=0;
drum(q);
fin.close();
fout.close();
return 0;
}

2.

Intr-o firma sunt n angajati, numerotati de la 1 la n, fiecare angajat avand un singur sef direct, cu exceptia
directorului, care nu are sef. Ierarhia firmei este data printr-un vector de tip tata. Fiecare angajat al firmei
are un salariu dat printr-un numar natural.
Angajatii si seful sunt recompensati astfel: castigul fiecarui salariat este egal cu salariul sau la care se adauga
media aritmetica a castigurilor subordonatilor sai directi. Media aritmetica se rotunjeste prin adaos la un
numar intreg (de exemplu 5.33 se rotunjeste la 6). Angajatii care nu au subordonati directi castiga doar

salariul.
Calculati care este castigul directorului firmei.
Exemplu:
firma.in
8 (numarul de angajati)
4 3 0 3 2 1 2 1 (vectorul tata)
2 6 4 3 7 3 1 5 (salariul fiecarui angajat)
firma.out
14

#include <fstream>
#include <cmath>
using namespace std;
ifstream fin("firma.in");
ofstream fout("firma.out");
int r,n, t[101],x[101], s[101];
int fii(int r)
{
int k=0;
for(int i=1;i<=n;i++) if(t[i]==r) k++;
return k;
}
int calcul(int v)
{
s[v]=0;
for(int i=1;i<=n;i++)
if(t[i]==v)
s[v]=s[v]+calcul(i);
if(fii(v)>0) return x[v]+ceil((float)s[v]/fii(v));
else return x[v];
}
int main()
{
fin>>n;
for(int i=1;i<=n;i++)
{
fin>>t[i];
if(t[i]==0) r=i;
}
for(int i=1;i<=n;i++) fin>>x[i];
fout<<calcul(r);
fin.close();
fout.close();
return 0;
}

3.

In fisierul countsub.in se da un arbore binar cu n varfuri (cel mult 1000) prin vectorii S si D (pentru fiecare
varf se precizeaza fiul stang si apoi cel drept). Sa se calculeze si sa se afiseze numarul de nivele ale arborelui
si apoi cate varfuri se afla pe fiecare nivel.
Exemplu:
countsub.in
6
35
06
00
12
00
00
countsub.out
3
123

#include <fstream>
using namespace std;
ifstream fin("nivelebin.in");
ofstream fout("nivelebin.out");
int nivele[1001],n, s[1001], d[1001],p[1001];
void completniv(int k, int niv)
{
if(k!=0)
{
nivele[k]=niv;
completniv(s[k],niv+1);
completniv(d[k],niv+1);
}
}
int main()
{
fin>>n;
for(int i=1;i<=n;i++)
{ fin>>s[i]>>d[i];
p[s[i]]=1; p[d[i]]=1;
}
int r=0;
for(int i=1;i<=n;i++)
if(p[i]==0) r=i;
completniv(r,0);
int nivmax=0;
for(int i=1;i<=n;i++)
if(nivele[i]>nivmax) nivmax=nivele[i];
fout<<nivmax+1<<endl;
for(int niv=0;niv<=nivmax;niv++)
{
int k=0;
for(int j=1;j<=n;j++)
if(nivele[j]==niv) k++;

fout<<k<<" ";
}
fin.close();
fout.close();
return 0;
}
4.

In fisierul countsub.in se da un arbore binar cu n varfuri (cel mult 1000) prin vectorii S si D (pentru fiecare
varf se precizeaza fiul stang si apoi cel drept). Sa se calculeze si sa se afiseze pentru fiecare varf v numarul
de varfuri din subarborele care il are pe v ca radacina.
Exemplu:
countsub.in
6
35
06
00
12
00
00
countsub.out
3
2
1
6
1
1

#include <fstream>
using namespace std;
ifstream fin("countsub.in");
ofstream fout("countsub.out");
int n, s[1001], d[1001];
int count(int k)
{
if(k==0) return 0;
else return 1+count(s[k])+count(d[k]);
}
int main()
{
fin>>n;
for(int i=1;i<=n;i++)
fin>>s[i]>>d[i];
for(int i=1;i<=n;i++)
fout<<count(i)<<endl;
fin.close();
fout.close();
return 0;
}

5.

Se dau doi arbori cu radacina prin doi vectori de tip tata. Determinati daca cei doi arbori cu radacina
reprezinta acelasi arbore (difera doar in urma alegerii radacinilor diferite)
Exemplu:
date.in
5
01122
31022
date.out
da

#include<fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");
int n,t[100],s[100];
void citire()
{ fin>>n;
for(int i=1;i<=n;i++)
fin>>t[i];
for(int i=1;i<=n;i++)
fin>>s[i];
}
int main()
{
citire();
int ok=1,gasit;
for(int i=1;i<=n;i++)
if(t[i])
{
gasit=0;
for(int j=1;j<=n;j++)
if(i==j && t[i]==s[j] || i==s[j] && t[i]==j)
gasit=1;
if(!gasit) ok=0;
}
if(ok) fout<<"da";
else fout<<"nu";
return 0;
}
6.

Se citeste un vector A cu n elemente numere intregi. Plasati indicii 1,2...n intr-un arbore binar astfel incat in
urma parcurgerii in inordine a aceastuia sa se afiseze vectorul A sortat crescator.
Arborele binar va fi reprezentat prin vectorii S si D.
Exemplu:
n=7
A=3 4 1 2 9 0 6
Vectorii S si D rezultati sunt:
S=3 0 6 0 7 0 0
D=2 5 4 0 0 0 0
iar vectorul A sortat:
A=0 1 2 3 4 6 9

#include <fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");
int S[100],D[100],A[100],n;
void make(int x, int v)
{
if(v!=x)
{
if(A[x]<A[v])
if(S[v]) make(x,S[v]);
else S[v]=x;
else if(D[v]) make(x,D[v]);
else D[v]=x;
}
}
void SRD(int v)
{
if(S[v]) SRD(S[v]);
fout<<A[v]<<" ";
if(D[v]) SRD(D[v]);
}
int main()
{
fin>>n;
for(int i=1;i<=n;i++)
{
fin>>A[i];
make(i,1);
}
for(int i=1;i<=n;i++) fout<<S[i]<<" ";
fout<<endl;
for(int i=1;i<=n;i++) fout<<D[i]<<" ";
fout<<endl;
SRD(1);
return 0;
}
7.

Se da o expresie aritmetica in forma poloneza prefixata. Expresia este formata din operatorii + - / * %, iar
operanzii sunt dintr-un singur caracter.
Construiti arborele binat asociat expresiei citite si afisati expresia in forma normala (infixata).
Exemplu:
/-+*5314+27
in forma normala este (((5*3)+1)-4)/(2+7)

#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("date.in");

ofstream fout("date.out");
int S[100],D[100],T[100],n;
char A[100];
void SRD(int v)
{
if(strchr("+/-*%",A[v]) && v!=0)fout<<"(";
if(S[v]) SRD(S[v]);
fout<<A[v];
if(D[v]) SRD(D[v]);
if(strchr("+/-*%",A[v]) && v!=0)fout<<")";
}
int main()
{
int n,v,pus;
fin>>A;
n=strlen(A)-1;
T[0]=-1;
for(int i=1;i<strlen(A);i++)
{
pus=0;
v=0;
while(!pus)
{
while(S[v] && strchr("/*-+%",A[S[v]])) v=S[v];
if(S[v]==0) { S[v]=i; pus=1; T[i]=v; }
else if(D[v] && strchr("/*-+%",A[D[v]])) v=D[v];
else {
if(D[v]==0) { D[v]=i; pus=1;T[i]=v;}
else { v=T[v];
while(T[v]!=-1 && !(D[v]==0 || strchr("/*+%",A[D[v]])))
v=T[v];
if(D[v]==0) { D[v]=i; pus=1;T[i]=v;}
else if(strchr("/*-+%",A[D[v]])) v=D[v];
}
}
}
}
SRD(0);
return 0;
}

Potrebbero piacerti anche