【发布时间】:2013-10-08 09:35:46
【问题描述】:
假设我有以下内容:
_____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”标签标记了这个问题,仅仅是因为我对这个树形结构的实际实现[以及我应用到它的其他算法并且 not 有未回答的问题] 发生用那种语言。我也可以翻译伪代码。)
编辑 - 作为上面第一棵树上的一些示例步骤,这可能更有意义:
- 从
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是完整的子树,有孩子、孙子等等。现在的问题是:这些子树在整个级别上是否相同在T的范围?那么A son of T的子子树集是否与B son of T的子子树集相同?
【问题讨论】:
-
帮助我理解你所追求的概括。您是否总是想比较第 3 级的元素?根的所有子节点的叶子集?还是别的什么?
-
@jacobm 添加了一个编辑(希望)更清晰的想法。
-
所以要明确一点:您似乎想确定 W 的所有直接子代是否相同,除了它们的最顶层标签。那正确吗?例如,如果
A是一棵大树而不仅仅是一片叶子,那么您绘制的树中A的每个外观都需要具有完全相同的形状和标签? -
@jacobm 是的,我想这可能是最短的解释:从根(这里,
W)开始,我的所有直接子子树的形状和标签都相同,除了他们根上的标签?下到我的直系子女(这里,T、L和X),问他们每个人同样的问题。然后他们的孩子等等,本质上是广度优先遍历,在每个节点问这个问题。 -
考虑在cs.stackexchange.com问cs相关的问题。