#include <iostream>
#include <vector>

using namespace std;

template <typename T>
class GraphNode {

public:
    T data;
    vector<GraphNode*> adj;

    void Print(GraphNode<T>* node) {

        if(!node) {
            std::cout << "*";
            return;
        }

        std::cout << node->data << ":";

        for(typename vector<GraphNode<T>* >::iterator iter = adj.begin();
                iter != adj.end();
                iter++)
        {
            Print(iter);
        }
    }
};

template <typename T>
class BinaryTreeNode : public GraphNode<T> {

public:
    using GraphNode<T>::data;
    using GraphNode<T>::adj;
    
    BinaryTreeNode<T>* lhs;
    BinaryTreeNode<T>* rhs;

    BinaryTreeNode() {
        adj.push_back(NULL);
        adj.push_back(NULL);

        lhs = NULL;
        rhs = NULL;
    }

    BinaryTreeNode(T in_data) {
        data = in_data;

        adj.push_back(NULL);
        adj.push_back(NULL);

        lhs = NULL;
        rhs = NULL;
    }


    BinaryTreeNode& operator=(const BinaryTreeNode& other) {

        // if the other item is this, then return itself
        if(&other != this) {
            data = other.data;
            // copy the vector
            lhs = other.lhs;
            rhs = other.rhs;
        }
        return *this;
    }

};

int main() {
	BinaryTreeNode<int> node;
	cout << 42;
	return 0;
}