function [T,l,C] = huffman_tree(p)
	if nargin < 1
		% argomenti di default
		p = [0.33 0.4 0.2 0.05 0.02];
	end
	
	% cardinalità dell'alfabeto
	N = numel(p);
	
	% alloca la matrice che rappresenta l'albero
	% T(n,1): probabilità del nodo
	% T(n,2): antenato
	% T(n,3): figlio destro
	% T(n,4): figlio sinistro
	T = zeros(2*N-1,4);
	for n = 1:N
		T(n,1) = p(n);
	end
	
	% loop sui nodi da aggiungere
	for n = N+1:2*N-1
		
		% trovare i due nodi senza antenati
		% con la probabilità più piccola
		p1 = 1;
		i1 = 0;
		p2 = 1;
		i2 = 0;
		for i = 1:n-1
			if T(i,2) == 0
				if T(i,1) < p1
					p2 = p1;
					i2 = i1;
					p1 = T(i,1);
					i1 = i;
				elseif T(i,1) < p2
					p2 = T(i,1);
					i2 = i;
				end
			end
		end
		
		% assegna le relazioni
		T(n,1) = p1+p2;
		T(n,3) = i1;
		T(n,4) = i2;
		T(i1,2) = n;
		T(i2,2) = n;
	end
	
	% trova le lunghezze delle parole
	l = zeros(N,1);
	for n = 1:N
		temp = 0;
		a = T(n,2);
		while a
			temp = temp + 1;
			a = T(a,2);
		end
		l(n) = temp;
	end
	
	% trova le parole di codice
	C = zeros(N,max(l));
	for n = 1:N
		f = n;
		for temp = l(n):-1:1
			a = T(f,2);
			if T(a,4) == f
				C(n,temp) = 0;
			else
				C(n,temp) = 1;
			end
			f = a;
		end
	end
end
