CareerCup-4.7
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;
typedef int Data;
struct Node
{
Node(Data d):data(d){left = right = NULL;};
Data data;
Node* left;
Node* right;
Node* parent;
};
class Tree
{
public:
Tree():root(NULL){};
Node* root;
bool contains(Tree dst)
{
return subTree(root, dst.root);
};
private:
bool matchTree(Node* a, Node* b)
{
if(a == NULL && b == NULL)
return true;
if(a != NULL && b != NULL && a->data == b->data)
return matchTree(a->left, b->left) && matchTree(a->right, b->right);
return false;
};
bool subTree(Node* a, Node* b)
{
if(b == NULL)
return true;
if(a == NULL)
return false;
if(a->data == b->data)
{
return matchTree(a, b);
} else {
return subTree(a->left, b) || subTree(a->right, b);
}
};
};
int main()
{
Tree tree;
tree.root = new Node(5);
tree.root->left = new Node(1);
tree.root->right = new Node(7);
tree.root->left->right = new Node(4);
tree.root->left->right->left = new Node(3);
Tree tree2;
tree2.root = new Node(4);
tree2.root->left = new Node(3);
cout<<boolalpha<<tree.contains(tree2);
system("pause");
};