使用树的序列化和每个子树的唯一id生成的树匹配

时间:2009-03-29 05:14:28

标签: c++ binary-tree

Binary tree http://img9.imageshack.us/img9/9981/binarytree.jpg

序列化给定二叉树的最佳方法是什么,并为每个序列化二叉树计算唯一ID?

例如,我需要序列化子树(2,7,(5,6,11))并生成表示该子树的唯一ID“ x ”,以便每当我遇到了一个类似的子树(2,7,(5,6,11))它将序列化为相同的值' x ',因此我可以推断出我找到了一个匹配

这里我们假设每个节点都具有唯一的属性。在上面的例子中,它将是分配给每个节点的数字,因此它们总是为类似的子树生成相同的id。我试图用C ++做这件事。

是否已存在执行此类序列化树匹配的算法?

4 个答案:

答案 0 :(得分:2)

您是否希望能够匹配树的任意部分或运行到某些叶节点的子树? IIUC,你正在寻找后缀匹配。

您还可以查看Compact Directed Acyclic Word Graph的想法。

答案 1 :(得分:2)

我会根据节点的ID和树中的位置制作哈希值(以某种Rabin-Karp方式),即:

long h = 0
for each node in sub tree:
    h ^= node.id << (node.depth % 30)
伪代码中的

。缺点是不同的子树可能产生相同的哈希值。但优点是比较哈希值的速度很快,并且当找到匹配时,您可以进一步研究实际的子树是否相等。

答案 2 :(得分:1)

如果您不寻求高效率,您可能需要使用非常简单的深度优先搜索算法。

"2,7,2,U,6,5,U,11,U,U,U,5,9,4"

如您所见,我添加了U命令(“up”)以显示下一个孩子的创建位置。当然,你可以提高效率,但我相信这是一个开始。

此外,您可能希望查看Boost.Graph(BGL)以实现。

答案 3 :(得分:1)

您在问题中使用的括号表示法有什么问题?