比较两个二叉树有什么大不了的?

时间:2015-04-13 04:02:39

标签: java data-structures binary-tree big-o

如果一个二叉树具有x个节点而另一个具有y个节点,其中x大于y。我在考虑O(n 2 )因为搜索每个节点是O(n)。

如何插入然后比较树?

1 个答案:

答案 0 :(得分:0)

假设你的二进制树是排序的,这是一个O(n)操作(其中n是两棵树中节点的总和,不是产品)。

当元素不同时,您可以简单地通过树停止运行两个“索引”。如果你到了两个的末尾并且没有找到差异,那么树是相同的,类似于下面的伪代码:

def areEqual (tree1, tree2):
    pos1 = first (tree1)
    pos2 = first (tree2)
    while pos1 != END and pos2 != END:
        if tree1[pos1] != tree2[pos2]:
            return false
        pos1 = next (tree1, pos1)
        pos2 = next (tree2, pos2)
    if pos1 != END or pos2 != END:
        return false
    return true

如果他们没有排序,并且您没有其他信息可能允许您优化该功能,并且不能使用额外的数据结构,那么它将是O(n 2 < / sup>),因为你必须在第二个树中为第一个节点中的每个节点找到一个任意相等的节点(并以某种方式标记它以表示你已经使用过它)。


请记住,如果前者更重要(通常是),通常会有时间交换空间。

例如,即使使用完全无序的树,也可以通过使用散列来显着降低复杂性,例如:

def areEqual (tree1, tree2):
    hash = []

    # Add all items from first tree.

    for item in tree1.allItems():
        if not exists hash[item]
            hash[item] = 0
        hash[item] += 1

    # Subtract all items from second tree.

    for item in tree2.allItems():
        if not exists hash[item]
            hash[item] = 0
        hash[item] -= 1
        if hash[item] == 0:
            delete hash[item]

    if hash.size != 0:
        return false

    return true

由于散列倾向于向O(1)分摊,因此整个问题可以被认为是O(n)。