prufer:
一种将带标号的树用一个唯一的长度为\(n-2\)整数序列表示的方法。
Prüfer 是这样建立的:
每次选择一个编号最小的叶结点并删掉它,然后在序列中记录下它连接到的那个结点。重复 𝑛 −2
rep(i,1,n-1){cin>>f[i];deg[i]++;deg[f[i]]++;}int pos=1;for(int i=1;i<=n-2;i++){while(deg[pos]!=1)pos++;p[i]=f[pos];while(i<=n-2 && --deg[p[i]]==1 && p[i]<pos){p[i+1]=f[p[i]];i++;}pos++;}
Prüfer 序列的性质
在构造完 Prüfer 序列后原树中会剩下两个结点,其中一个一定是编号最大的点 𝑛
每个结点在序列中出现的次数是其度数减 1
(没有出现的就是叶结点)
prufer重构树:
rep(i,1,n)deg[i]++;for(int i=1;i<=n-2;i++){cin>>p[i];deg[p[i]]++;}p[n-1]=n;int pos=1;rep(i,1,n-1){while(deg[pos]!=1)pos++;f[pos] = p[i];while(i<=n-1 && --deg[p[i]]==1 && p[i]<pos){f[p[i]]=p[i+1];i++;}pos++;}