说我有以下内容:
_____W_____
| | |
_T_ _L_ _X_
| | | | | |
A B A B A B
如您所见,它是一棵标准树(不是二叉树,事实证明它W
有三个孩子)。我的目标是确定A B
子序列在整个底层重复的事实。
更一般地说,我希望能够从树的根部开始,查看我的孩子的子子树集(本质上是孙子树集)并确定它们在整个树中是否相同水平,然后递归到我的孩子,并在每个较小的范围内做同样的事情。冲洗,重复,一直到整个树的底部。
我想到的一个简单的解决方案是对每个子树(在本例中为 、 和 )进行广度优先(或深度优先)遍历T
并L
比较X
我想出的单词(减去第一个字符)。在这种情况下,广度优先遍历会产生TAB
,LAB
和XAB
,并且忽略第一个字符,我会看到它们都是AB
. 但是想象一下,如果树是以下内容:
_____W_____
| | |
_T_ _L_ _X_
| | | | | |
A B Q B A B
能够抓住第一个A
,然后Q
意识到它们是不一样的,并且继续搜索和短路是没有意义的,效率会高得多。
我主要是想看看是否有一些“明显”的算法可以在这里应用,或者,也许是为这个特定问题创建的算法;我从未见过、找不到和/或不知道如何搜索。
(我还用“Java”标签标记了这个问题,仅仅是因为我对这个树结构的实际实现[以及我正在应用的其他算法并且没有未回答的问题]恰好是用那种语言。我可以翻译伪代码,以及。)
编辑- 作为上面第一棵树上的一些示例步骤,这可能更有意义:
- 从
W
(根)开始。 - 我有 2 个或更多孩子吗?在这种情况下,是的,3:
T
,L
,X
。 - 比较
T
、L
和X
的子子树。 - 在' 范围内的整个级别上
T
,L
、 和X
' 的子子树集是否相同?在这种情况下,是的,它一直在跨越。在上面的第二棵树中,答案是否定的,因为这会把事情搞砸。W
A B
Q
- 现在下拉到
W
的孩子、T
、L
和X
。从上面重复前面的步骤。T
有2个或更多的孩子吗?是的,A
并且B
。他们有孩子吗?在上面的例子中,没有,所以没有什么可做的。但是想象A
和B
是整个子树,有孩子、孙子等等。现在的问题是:这些子树在's 范围内的整个级别上是否相同?那么' 的子子树集与 ' 子子树的集相同吗?T
A son of T
B son of T