\mathbf{X1}:我来翻译一下短信的内容。
定义:本文所述的树是归纳定义的:单独的结点构成一棵树,以一棵树作为左(或右)孩子可以构成一棵树,以两棵树分别作为左、右孩子也可以构成一棵树。仅由以上规则用有限步生成的所有结构被称为树。
\mathbf{X2}:也就是说,这里所说的树是指非空、有根、区分左右孩子的二叉树。
\mathbf{X1}:的确如此。接下来书上定义了两棵树的同构。
定义:称两棵树 T, T^{\prime} 同构,记做 T \equiv T^{\prime},由以下四条规则定义:
- 由单独结点构成的树是彼此同构的;
- 如果两棵树的根结点均只有左子树,并且它们的左子树同构,那么这两棵树是同构的;
- 如果两棵树的根结点均只有右子树,并且它们的右子树同构,那么这两棵树是同构的;
- 如果两棵树的根结点均有左、右子树,并且它们的左、右子树分别对应同构,那么这两棵树是同构的。
很明显,同构关系构成了所有树上的一个等价关系。为了方便,我们将同构的树看作相同的树。
\mathbf{X2}:将同构的树看成相同的树就是说树的结点是彼此相同的。简单地说,两棵树同构当且仅当他们在结点无标号、区分左右孩子的意义下相同;我们说两棵树不同,当且仅当它们不同构。
\mathbf{X1}:书里还定义了树的叶子:和通常的定义一样,叶子指没有任何孩子的结点。
\mathbf{X2}:这和我们熟悉的定义完全一致。嘛,数学家真是有点啰嗦…… 恐怕只有 \mathbf{X3} 那种家伙会喜欢这种做派吧。
\mathbf{X1}:我倒是对此不太反感 —— 比起基于经验的 “直觉”,准确的定义和严谨的证明还是更加让人安心。你看,下一个定义就没有那么直观了。
定义:称一棵树 T 单步替换成为 T^{\prime},如果将 T 的某一叶子结点替换为另一棵树 T^{\prime \prime} 得到的树与 T^{\prime} 同构,记做 T \rightarrow T^{\prime};称一棵树 T 替换成为 T^{\prime},记做 T \rightarrow^{\star} T^{\prime},如果存在自然数 n \geq 1 和树 $T{1}, T{2}, \ldots, T{n},使得 T \equiv T{1} \rightarrow T{2} \rightarrow \cdots \rightarrow T{n} \equiv T^{\prime}$。
\mathbf{X2}:我来想想…… 所谓替换,就是删掉某个叶子结点并在对应的位置放入另一棵树,就像那个叶子结点 “长出了” 一个更大的子树一样;一棵树替换成为另一棵树,说明它可以经由零次、一次或多次单步替换得到那棵树。哦…… 我明白了!举例来说,任何一棵树都可以替换成它本身,换言之对于树 T,都有 T \rightarrow^{\star} T^{\prime}。下面这个图片可以帮助理解单步替换和替换的含义。

\mathbf{X1}:你说得对。特别地,任何一棵树都可以替换得到无穷多棵不同的树,并且仅有一个结点构成的树可以替换得到任意其他的树。书上也有定义这样的东西。
定义:对于一棵树 T,定义 \operatorname{grow}(T) 表示 T 所能替换构成的树的集合,即 \operatorname{grow}(T)=\left{T^{\prime} \mid T \rightarrow^{\star} T^{\prime}\right}。更近一步,如果 $\mathscr{T}=\left{T{1}, T{2}, \ldots, T{n}\right} 是一个树的有限集合,定义 \operatorname{grow}(\mathscr{T}) 为所有 \operatorname{grow}\left(T{T{i} \in \mathscr{T}} \operatorname{grow}\left(T_{i}\right)$$
\mathbf{X2}:我们把 \operatorname{grow}(\mathscr{T}) 称作树的集合 \mathscr{T} 所生长得到的集合吧 —— 也就是说,树的集合 \mathscr{T} 所生长得到的集合包含所有可以被某个 T \in \mathscr{T} 替换得到的树。不妨把树的集合叫做树林。不太严谨地说,一个树林所生长得到的新树林就是其中所有树、以所有可能的方式生长得到的树林。显而易见,一个非空树林所生长得到的树林都是无穷树林。但这个无穷树林,或者说 \operatorname{grow}(\mathscr{T}),并不一定包含所有的树 —— 更进一步,它甚至不一定包含 “几乎所有” 的树。
\mathbf{X1}:让我来补充一下:我们称一个树林是几乎完备的(或称几乎包含了所有的树),如果仅有有限多的树不在其中。对于一个有限树林 \mathscr{T},\operatorname{grow}(\mathscr{T}) 要么包含了所有的树,要么包含了几乎所有的树,要么存在无穷多棵树不在其中。如果这是一道 OI 题,出题人一定会在样例中给出三种情况的例子吧。书上的关键定理也用了和我们相同的定义。
定理(几乎完备的可判定性):一个树的集合是几乎完备的,如果仅有有限棵树不在其中。那么,对于一个给定的树的有限集合 \mathscr{T},存在高效的算法判定 \operatorname{grow}(\mathscr{T}) 是否是几乎完备的。
\mathbf{X2}:这个问题变成一个纯粹的 OI 题目了!让我用我们的语言来重述一下题意:给定一个有限大小的树林 \mathscr{T},判定 \operatorname{grow}(\mathscr{T}) 是否是几乎完备的,即是否仅有有限棵树不能被树林中所包含的树生长得到。
\mathbf{X1}:也就是说,给定一个有限的树的集合 \mathscr{T},判定是否仅有有限个树 T,满足 T \notin \operatorname{grow}(\mathscr{T})。所谓 T \notin \operatorname{grow}(\mathscr{T}),就是说不存在 T^{\prime} \in \mathscr{T},使得 T^{\prime} \rightarrow^{\star} T。这和通常的 OI 题目的确非常不同:我甚至没有想到这个问题的一个算法。
\mathbf{X2}:我也一样,不过我很久没有感受到这种解决未知问题的冲动了。