假设所有节点值都相同。我们想知道两个这样的二叉树是否是同构的。允许翻转左右儿童。
好的,有人问我做了什么。这里是。我做了天真的做法。
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);
}
答案 0 :(得分:1)
是。该算法归功于Aho - Hopcroft - Ullman。
逐层处理树木。每个节点都标有1之间的正整数和其级别上的节点数,在其级别内,它们标识其同构类。当且仅当它们最终具有相同的标签时,这两棵树是同构的。
当我们处理一个级别时,已经处理了更深层次的节点。为了计算这个级别的标签,我们从一堆无序对{L,R}开始,其中L是左子标签,R是右子标签(0对于空子项),我们将每个分配为正整数。这是通过对基线进行基数排序(一次一个坐标)然后比较排序顺序中相邻的元素来完成的。排序顺序的标签不减少;只要两对连续不同,它们就会增加。