树同构

树同构(Tree Isomorphism)描述的是图论中，两个树之间的完全等价关系。在图论的观点下，两个同构的树可以被当作同一个图来研究。 树同构的概念源于图同构。图同构的概念为，两个简单图 G {\displaystyle G} 和 H {\displaystyle H} 称为是同构的，当且仅当存在一个将 G {\displaystyle G} 的节点 1 , … , n {\displaystyle 1,\ldots ,n} 映射到 H {\displaystyle H} 的节点 1 , … , n {\displaystyle 1,\ldots ,n} 的一一对应 σ {\displaystyle \sigma } ，使得 G {\displaystyle G} 中任意两个节点 i {\displaystyle i} 和 j {\displaystyle j} 相连接，当且仅当 H {\displaystyle H} 中对应的两个节点 σ ( i ) {\displaystyle \sigma (i)} 和 σ ( j ) {\displaystyle \sigma (j)} 相连接。树同构即在以上定义中增加 G {\displaystyle G} 和 H {\displaystyle H} 都是树的限制条件。两颗树 T 1 , T 2 {\displaystyle T_{1},T_{2}} 同构可以记作 T 1 ≃ T 2 {\displaystyle T_{1}\simeq T_{2}} 。 在此基础上，定义有根树及其同构的概念。有根树可表示为(T,r)，其中T表示一棵树， r ∈ V ( T ) {\displaystyle r\in V(T)} 是一个有特殊标记的点，称为树的根结点。对于边 x y ∈ E ( T ) {\displaystyle xy\in E(T)} ，若x在根结点到y的路径上，称x为y的父结点，y为x的子结点。有根树的表示形式可以为“种植的树”，即根节点r标有向下箭头；所有结点的子节点都画在该点上方。 有根树同构的定义为，对于两颗有根树 ( T 1 , r 1 ) {\displaystyle (T_{1},r_{1})} ， ( T 2 , r 2 ) {\displaystyle (T_{2},r_{2})} ，存在一个同构映射 f {\displaystyle f} ，其中 f ( r 1 ) = r 2 {\displaystyle f(r_{1})=r_{2}} 。 ( T 1 , r 1 ) {\displaystyle (T_{1},r_{1})} 与 ( T 2 , r 2 ) {\displaystyle (T_{2},r_{2})} 同构可记作 ( T 1 , r 1 ) ≃ ( T 2 , r 2 ) {\displaystyle (T_{1},r_{1})\simeq (T_{2},r_{2})} 。 由以上定义可知，有根树同构的关系严格强于树同构的关系。 有根树同构的判定问题是P问题（P/NP问题）。这里介绍其中一种算法，该算法将有根树的比较转化为字符串的比较。 对有根树进行0-1编码，并且采用字典序对编码进行比较。字典序的比较方法为： 对不同序列 s = s 1 s 2 … s n {\displaystyle s=s_{1}s_{2}\dots s_{n}} 和 t = t 1 t 2 … t m {\displaystyle t=t_{1}t_{2}\dots t_{m}} ： 如果 s {\displaystyle s} 是 t {\displaystyle t} 的初始序列（即 t = s t i … t m {\displaystyle t=st_{i}\dots t_{m}} ），则 s < t {\displaystyle s<t} ; 如果 t {\displaystyle t} 是 s {\displaystyle s} 的初始序列（即 s = t s i … s n {\displaystyle s=ts_{i}\dots s_{n}} ），则 t < s {\displaystyle t<s} ; 令 i {\displaystyle i} 是 s i ≠ t i {\displaystyle s_{i}\neq t_{i}} 的最小下标，若 s i < t i {\displaystyle s_{i}<t_{i}} 则 s < t {\displaystyle s<t} ，若 t i < s i {\displaystyle t_{i}<s_{i}} 则 t < s {\displaystyle t<s} 。 例： 00 < 001 {\displaystyle 00<001} , 01 0 11 < 01 1 0 {\displaystyle 01{\textbf {0}}11<01{\textbf {1}}0} 。 对有根树(T,r)进行如下编码： 所有非根叶结点都赋值为01； 假设点v的子结点 w 1 , w 2 , … , w k {\displaystyle w_{1},w_{2},\dots ,w_{k}} 都已经完成编码，编码为 A ( w 1 ) , A ( w 2 ) , … , A ( w k ) {\displaystyle A(w_{1}),A(w_{2}),\dots ,A(w_{k})} ，且有 A ( w 1 ) ≤ A ( w 2 ) ≤ ⋯ ≤ A ( w k ) {\displaystyle A(w_{1})\leq A(w_{2})\leq \dots \leq A(w_{k})} ，则v结点的编码 A ( v ) = 0 A ( w 1 ) A ( w 2 ) … A ( w k ) 1 {\displaystyle A(v)=0A(w_{1})A(w_{2})\dots A(w_{k})1} 如此递归。r结点的编码 A ( r ) {\displaystyle A(r)} 即为该有根树的编码，用 # ( T , r ) {\displaystyle \#(T,r)} 表示。 若 # ( T 1 , r 1 ) = # ( T 2 , r 2 ) {\displaystyle \#(T_{1},r_{1})=\#(T_{2},r_{2})} ，则说明有根树 ( T 1 , r 1 ) {\displaystyle (T_{1},r_{1})} 与 ( T 2 , r 2 ) {\displaystyle (T_{2},r_{2})} 同构。 该算法的判定定理是： ( T 1 , r 1 ) ≃ ( T 2 , r 2 ) {\displaystyle (T_{1},r_{1})\simeq (T_{2},r_{2})} 当且仅当他们具有相同的0-1编码。 对该定理进行如下简单证明： 充分性：从有根树同构的定义和编码过程可证。 必要性：对编码进行解码。任意有根树的编码必然有 0 S 1 {\displaystyle 0S1} 的一般形式，其中 S = S 1 S 2 … S t {\displaystyle S=S_{1}S_{2}\dots S_{t}} 。 S 1 {\displaystyle S_{1}} 是 S {\displaystyle S} 中0,1个数相等的最小前缀， S 2 {\displaystyle S_{2}} 是第二个0,1平衡的最小前缀，以此类推，可以解码出唯一形态的有根树。这棵有根树的其他表示形式都与该解码形式同构。 树同构的判定算法基于有根树同构的判定算法构成。在前文所述中，有根树相对于树的区别在于，有根树有一个特定标记的根。对于一般的树，我们需要一种找根的算法；在确定这棵树的有根表达形式之后，对于有根树进行编码判定即可。 定义树的中心点集合 C ( T ) : { v ∈ T ( V , E ) | v  是使  max u ∈ T d ( u , w )  最小的点  } {\displaystyle C(T):\{v\in T(V,E)|v{\text{ 是使 }}\max _{u\in T}d(u,w){\text{ 最小的点 }}\}} 。由于 C ( T ) {\displaystyle C(T)} 至多包含两个顶点，且若 C ( T ) = 2 {\displaystyle C(T)=2} ，那么该两点必定相邻，故可以选择 C ( T ) {\displaystyle C(T)} 中的点为根。 树同构的判定算法中，首先通过删叶子结点的方式，算出 C ( T ) {\displaystyle C(T)} 。 若 C ( T ) = { r } {\displaystyle C(T)=\{r\}} ，那么 # ( T , r ) {\displaystyle \#(T,r)} 即为树T的编码。 若 C ( T ) = { r 1 , r 2 } {\displaystyle C(T)=\{r_{1},r_{2}\}} ，那么分别计算 # ( T , r 1 ) {\displaystyle \#(T,r_{1})} 与 # ( T , r 2 ) {\displaystyle \#(T,r_{2})} ，以其中较小的作为树T的编码。 若两棵树的编码相同，即可认为两棵树是同构的。 Jiří Matoušek (mathematician); Jaroslav Nešetřil. Invitation to discrete mathematics 2nd. Oxford. ISBN 9780198570431.