1、如果网络的拓扑结构是树,或者网络的生成树可用,可以使用树算法进行选举。在树算法中,要求至少所有叶子节点是算法的初始进程。想要开始选举的进程将消息<wakeup>扩散到所有进程中。布尔变量ws用于使每个进程至多发送一次消息。变量wr用于对接收的消息<wakeup>计数。当进程通过每个信道接收到消息<wakeup>,使其进行最小标识的计算。当进程进行判定时,就知道了领导人的标识。如果该标识与进程标识相等,它就称为领导人,否则就成为失败进程。
2、算法
var wsp :boolean init false;
wrp :integer init 0;
recp[q]:boolean for each qNeighp init false;
vp:P init p;
statep:(sleep,leader,lost) init sleep;
begin if p is initiator then
begin wsp:=true;
forall q∈Neighp do send <wakeup> to q
end;
while wrp<#Neighp do
begin receive <wakeup>;wrp=wrp+1;
if not wsp then
begin wsp:=true;
forall q∈Neighp do send <wakeup> to q
end
end;
while #{q:┐recp[q]}>1 do
begin receive <tok,r> from q;recp[q]:=true;
vp:=min(vp,r)
end;
send <tok,vp> to q0 with recp[q0];
receive <tok,r> from q0;
vp:=min(vp,r); (*decide with answer vp*)
if vp=p then statep:=leader else statep:=lost;
forall q∈Neighp,q≠q0 do send <tok,vp> to q
end