% p = etree_balance(A)
%
% Return an equivalent fill ordering to balance the etree.
% This is the Jess and Kees idea, but with a better implementation due to
% Tarjan, if I remember correctly.
function p = etree_balance(A)
n = length(A);
% Replace A with the filled in form of the symmetrized A.
A = A|A';
[count,h,parent,post,A] = symbfact(A);
A = A|A';
p = [];
remaining = ones(1,n);
while length(p) < n
U = remaining;
for v = 1:n;
if U(v)
nbrs = find(A(:,v).*remaining');
if all(all(A(nbrs,nbrs))) % if its neighbourhood is a clique
U(nbrs) = 0;
remaining(v) = 0;
p(end+1) = v;
end
end
end
end