You have two very large binary trees: T1, with millions of nodes, and T2, with hundreds of nodes. Create an algorithm to decide if T2 is a subtree of T1.
#include <iostream>
using namespace std;
struct TreeNode
{
int value;
TreeNode * left;
TreeNode * right;
TreeNode(int v, TreeNode * l, TreeNode * r)
{
value = v;
left = l;
right = r;
}
TreeNode(int v)
{
value = v;
left = NULL;
right = NULL;
}
};
//node1 contain node2
bool matchTree(TreeNode * node1, TreeNode * node2)
{
if (node1 == NULL && node2 != NULL)
return false;
else if (node2 == NULL)
return true;
else if (node1->value != node2->value)
{
cout<<"not"<<endl;
return false;
}
else if (node1->value == node2->value)
{
return matchTree(node1->left, node2->left) && matchTree(node1->right, node2->right);
}
}
bool subTree(TreeNode * node1, TreeNode * node2)
{
if (matchTree(node1, node2))
return true;
else if (node1->left)
{
cout<<"left"<<endl;
return subTree(node1->left, node2);
}
else if (node1->right)
{
cout<<"right"<<endl;
return subTree(node1->right, node2);
}
}
int main(int argc, char *argv[])
{
TreeNode * node0 = new TreeNode(0);
TreeNode * node1 = new TreeNode(1);
TreeNode * node2 = new TreeNode(2, node0, node1);
TreeNode * node3 = new TreeNode(3);
TreeNode * node4 = new TreeNode(4, node2, node3);
cout<<subTree(node1, node2)<<endl;
return 0;
}