分析我的子树算法?

时间:2013-10-01 21:25:59

标签: ruby algorithm binary-tree

我正在尝试在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

1 个答案:

答案 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的根匹配,则应该合理地工作。