    #include <algorithm>
    #include <iostream>
    #include <iomanip>
    using namespace std;

    template <typename KeyT, typename ValueT>
    class Node
    {
    public:
        Node(KeyT k, ValueT v)
        {
            key = k;
            value = v;
            right = NULL;
            left = NULL;
        }

        Node<KeyT, ValueT> * lowest()
        {
            Node<KeyT, ValueT> * v = this;

            if (right != NULL)
                if (v->value > left->value) v = left;
            if (left  != NULL)
                if (v->value > right->value) v = right;

            return v;
        }

        Node<KeyT, ValueT> * searchByKey(KeyT k)
        {
            if (key == k)
                return this;

            Node<KeyT, ValueT> * n = NULL;

            if (left != NULL)
                n = left->searchByKey(k);
            if (n != NULL) return n;
            if (right!= NULL)
                n = right->searchByKey(k);
            if (n != NULL) return n;

            return NULL;
        }

        Node<KeyT, ValueT> * getRight()
        {
            return right;
        }

        Node<KeyT, ValueT> * getLeft()
        {
            return left;
        }

        void setRight(Node<KeyT, ValueT> * nright)
        {
            right = nright;
        }

        void setLeft(Node<KeyT, ValueT> * nleft)
        {
            left = nleft;
        }

        KeyT getKey()
        {
            return key;
        }

        ValueT getValue()
        {
            return value;
        }

    private:
        KeyT   key;
        ValueT value;

        Node<KeyT, ValueT> * right;
        Node<KeyT, ValueT> * left;
    };

    int main(int c, char * v[])
    {
        Node<int, int> * tree = new Node<int, int>(4, 6);
        tree->setRight(new Node<int, int>(6, 7));
        tree->setLeft(new Node<int, int>(2, 8));

        Node<int, int> * result = NULL;

        result = tree->lowest();
        cout << setw(16) << "Lowest: " << "Key:" << result->getKey() << " Value:" << result->getValue() << endl;

        result = tree->searchByKey(2);
        cout << setw(16) << "By key 2: " << "Key:" << result->getKey() << " Value:" << result->getValue() << endl;
    }