采用以下算法来查找两个二叉树是否同构。
isomorphic(Node root1, Node root2) {
if (root1 == null && root2 == null) {
return true;
}
if (root1 == null || root2 == null) {
return false;
}
if (root1.data != root2.data) {
return false;
}
return (isIsomorphic(root1.left, root2.left) &&
isIsomorphic(root1.right, root2.right)) ||
(isIsomorphic(root1.left, root2.right) &&
isIsomorphic(root1.right, root2.left));
}
来源:geeksforgeeks
他们声称这段代码的时间复杂度是 O(n),因为我们访问每个节点一次。正如评论者指出的那样,这不是真的。
您给出的代码需要 O(n2) 时间。
确定有根树的同构问题,其中子级的顺序无关紧要,可以在线性时间内很容易完成。
为此,您可以递归地为两个树中的每个节点分配一个整数,这样两个节点将具有相同的编号(当且仅当它们是同构时)。 要获取节点的编号:
使用此过程,只需获取要比较的两棵树的根的数字即可。 它们是同构的,当且仅当它们具有相同的数字。