找出两棵树是否同构

时间:2014-01-31 08:39:28

标签: c++ algorithm data-structures binary-tree

如果两棵树具有相似的结构,则它们可以称为同构,并且它们之间唯一的区别可能是它们的子节点可能交换也可能不交换。例如:

     4                 4
   /   \             /   \
  2     6    and    6     2
 / \   / \         / \   / \
1   3 5   7       1   3 7   5

以下代码应该是我在网络上找到的正确实现,但由于某种原因它不适用于上述树。我做错了什么?

#include <iostream>
using namespace std;

class Node{

public:

    Node * left;
    Node * right;
    int val;

    Node(int v){
        left = NULL;
        right = NULL;
        val = v;    
    }
};

bool isIsomorphic(Node* n1, Node *n2)
{
 // Both roots are NULL, trees isomorphic by definition
 if (n1 == NULL && n2 == NULL)
    return true;

 // Exactly one of the n1 and n2 is NULL, trees not isomorphic
 if (n1 == NULL || n2 == NULL)
    return false;

 if (n1->val != n2->val)
    return false;

 // There are two possible cases for n1 and n2 to be isomorphic
 // Case 1: The subtrees rooted at these nodes have NOT been "Flipped".
 // Both of these subtrees have to be isomorphic, hence the &&
 // Case 2: The subtrees rooted at these nodes have been "Flipped"
 return
 (isIsomorphic(n1->left,n2->left) && isIsomorphic(n1->right,n2->right))||
 (isIsomorphic(n1->left,n2->right) && isIsomorphic(n1->right,n2->left));
}

int main()
{
Node * na_4 = new Node(4);
Node * na_2 = new Node(2);
Node * na_6 = new Node(6);
Node * na_1 = new Node(1);
Node * na_3 = new Node(3);
Node * na_5 = new Node(5);
Node * na_7 = new Node(7);

na_4->left = na_2;
na_4->right = na_6;

na_2->left = na_1;
na_2->right = na_3;

na_6->left = na_5;
na_6->right = na_7;


Node * nb_4 = new Node(4);
Node * nb_6 = new Node(6);
Node * nb_2 = new Node(2);
Node * nb_1 = new Node(1);
Node * nb_3 = new Node(3);
Node * nb_7 = new Node(7);
Node * nb_5 = new Node(5);

nb_4->left = nb_6;
nb_4->right = nb_2;

nb_6->left = nb_1;
nb_6->right = nb_3;

nb_2->left = nb_7;
nb_2->right = nb_5;


if(isIsomorphic(na_4, nb_4)){
    cout << "Yes they are isomorphic" << endl;
}
else
{
    cout << "No there are not isomorphic" << endl;
}

return 0;
}

它输出它们不是同构的。

2 个答案:

答案 0 :(得分:3)

根据提供的here定义,这些树不是同构的:

  

如果其中一个树可以通过一系列翻转从其他树中获得,即通过交换多个节点的左右子节点,则将两个树称为同构。任何级别的任意数量的节点都可以交换子节点。两棵空树是同构的。

因为,在一棵树中,2有孩子1和3,但在另一棵树中,2有孩子7和5。

通过交换两个孩子,你实际上是在交换他们的整个子树,而不仅仅是那些节点,而将所有其他子节点交换到原来的位置。

例如,这两个将是同构的:

     4
   /   \
  2     6
 / \   / \
1   3 5   7

     4
   /   \
  6     2
 / \   / \
7   5 1   3

答案 1 :(得分:0)

这些给定的树不是同构的。当且仅当其中一个树可以通过一系列翻转从其他树中获得时,即通过交换多个节点的左和右子节点,两个树被称为同构。此外,任何级别的任意数量的节点都可以交换其子节点。