我正在尝试在Ruby中实现一个函数来检查二进制tree2是否是二叉树的子树1。这是我到目前为止 - 它似乎工作,但我不确定它是多么可扩展。这是O(2 ^ k)时间吗?如果是这样,任何想法如何优化它?我假设tree1和tree2属于具有属性数据的类Node,左和右。
def containsTree(tree1, tree2)
if tree2.nil?
return true
if tree1.nil?
return false
if tree1.data == tree2.data
containsTree(tree1.left, tree2.left) && containsTree(tree1.right, tree2.right)
else
containsTree(tree1.left, tree2) || containsTree(tree1.right, tree2)
end
end
答案 0 :(得分:1)
似乎你可以写一些遍历tree1
的东西,寻找其数据与tree2
的根节点数据相同的节点。当您找到这样的节点时,遍历从该节点开始的子树与tree2
并行,检查每个节点是否匹配。你应该同时到达两棵树的尽头。
当然,tree1
中可能有许多节点的数据与tree2
的根节点匹配。
算法看起来像这样(不是在Ruby中):
// this method looks for nodes in tree1 that match the root node of tree2
traverse(node, tree2root)
{
if (node == null) return
if node.data == tree2root.data
if check_trees(node, tree2root)
print "tree2 is a subtree"
traverse(node.left, tree2root)
traverse(node.right, tree2root)
}
check_trees(tree1, tree2)
{
if (tree1 == null && tree2 == null)
return true
if (tree1 == null || tree2 == null)
return false
if (tree1.data != tree2.data)
return false
if (!check_trees(tree1.left, tree2.left))
return false
return check_trees(tree1.right, tree2.right)
}
你打电话给:
traverse(tree1, tree2)
如果您希望在找到匹配项后停止,则需要在traverse
方法中添加早期版本。
在一般情况下,这并不是非常有效,但如果tree1
中的数据与tree2
的根匹配,则应该合理地工作。