【发布时间】:2013-08-19 21:02:03
【问题描述】:
假设我有二叉树 A 和 B,我想知道 A 是否是 B 的“一部分”。我说的不仅仅是子树。我想知道的是 B 是否拥有 A 拥有的所有节点和边。
我的想法是,由于树本质上是一个图,我可以将此问题视为子图同构问题(即检查 A 是否是 B 的子图)。但根据维基百科,这是一个 NP 完全问题。
http://en.wikipedia.org/wiki/Subgraph_isomorphism_problem
我知道您可以使用 O(n) 算法检查 A 是否是 B 的子树(例如,使用前序和中序遍历将树展平为字符串并检查子字符串)。我试图稍微修改一下,看看我是否也可以只测试“部分”,但无济于事。这就是我卡住的地方。
除了使用子图同构之外,还有其他方法可以查看此问题吗?我认为必须有更快的方法,因为二叉树是更受限制和更简单的图形版本。
提前致谢!
编辑:我意识到,对于我的问题,即使是蛮力方法的最坏情况也只会采用 O(m * n),这是多项式。所以我想这毕竟不是一个NP完全问题。那么我的下一个问题是,有没有比 O(m*n) 更快的算法?
【问题讨论】:
-
你的节点被标记了吗?换句话说,如果一棵树是 CB 而另一棵树是 CA 那么这些被认为是相同的吗? (如果节点被标记,它们是不同的,否则相同)
-
是的,它们可以被贴上标签,不,它们会被认为是不同的
标签: algorithm graph binary-tree complexity-theory graph-algorithm