二叉树问题。检查相似的形状

时间:2009-04-12 14:54:03

标签: java algorithm tree

嗨,我坚持这样做,不知道如何去做。

如果我有两棵二叉树,我如何检查它是否具有相同的形状?节点中的数据无关紧要,只要树结构相等。

关于如何解决这个问题的任何想法?

5 个答案:

答案 0 :(得分:15)

您可以使用递归轻松完成此操作。以下代码有效,因为当且仅当它们各自的子树具有相同的形状时,两个非空树具有相同的形状。

boolean equalTrees(Node lhs, Node rhs)
{
    // Empty trees are equal
    if (lhs == null && rhs == null)
        return true;

    // Empty tree is not equal to a non-empty one
    if ((lhs == null && rhs != null)
        || (lhs != null && rhs == null))
        return false;

    // otherwise check recursively
    return equalTrees(lhs.left(), rhs.left())
        && equalTrees(lhs.right(), rhs.right())
}

要检查两棵树,请将其根节点传递给上面的函数。

equalTrees(tree1.root(), tree2.root())

答案 1 :(得分:2)

并行的两个广度优先搜索将是单向的。

http://en.wikipedia.org/wiki/Breadth-first_search

使用BFS,您可以同时检查树的特定级别的所有节点。这样,如果你不区分右边和左边的孩子(即如果你的树被认为是相同的,如果一个节点的对手有一个孩子,不管“右”或“左”孩子)你可以在那时处理。

答案 2 :(得分:2)

  

如果我有两个二叉树,我如何检查它们是否具有相同的形状?

您将很高兴知道二叉树具有一个有趣的属性:they can be represented as arrays只需将每个树转换为其中一个数组并比较数组内容即可。空白单元格对应于不存在的左或右子项,定义树的结构。您希望迭代两个数组并确保在一个数组中遇到的每个空单元格出现在另一个数组中;这是O(n)。

当然,如果数组大小不同,则根本不需要做任何工作,因为具有不同数量节点的树不可能具有相同的结构。从那里开始,你们都完成了。

答案 3 :(得分:0)

按预先顺序和按顺序使用符号名称而不是实际数据,并比较生成的字符串。也许对您的数据结构的更多输入将是有用的。

与java无关的AFAICT

答案 4 :(得分:0)

只需按照分支,在另一棵树中模仿每一个动作。在Python伪代码中:

class Tree:
    def __init__(self, value, left=None, right=None):
        self.value = value
        self.left = left
        self.right = right

def same_shape(T1, T2):
    if T1 == None:
        return T2 == None

    if T2 == None:
        return T1 == None

    return same_shape(T1.left, T2.left) and same_shape(T1.right, T2.right)