是否有可能检查两个二叉树是否在线性时间内同构?

时间:2015-10-19 22:52:57

标签: c++ algorithm graph graph-algorithm

假设所有节点值都相同。我们想知道两个这样的二叉树是否是同构的。允许翻转左右儿童。

好的,有人问我做了什么。这里是。我做了天真的做法。

bool isIsomorphic(Node* a, Node* b) {
   if(a == b) return true;
   if(!a || !b) return false;

   return isIsomorphic(a->left, b->left) && isIsomorphic(a->right, b->right)
       || isIsomorphic(a->left, b->right) && isIsomorphic(a->right, b->left);

}

1 个答案:

答案 0 :(得分:1)

是。该算法归功于Aho - Hopcroft - Ullman。

逐层处理树木。每个节点都标有1之间的正整数和其级别上的节点数,在其级别内,它们标识其同构类。当且仅当它们最终具有相同的标签时,这两棵树是同构的。

当我们处理一个级别时,已经处理了更深层次的节点。为了计算这个级别的标签,我们从一堆无序对{L,R}开始,其中L是左子标签,R是右子标签(0对于空子项),我们将每个分配为正整数。这是通过对基线进行基数排序(一次一个坐标)然后比较排序顺序中相邻的元素来完成的。排序顺序的标签不减少;只要两对连续不同,它们就会增加。