Implement 2-3-trees with insert search and remove operations. You must use the coloured pointer implementation trick, but you must NOT allow any 4 or 1 nodes to exist in the tree after an operation has completed. Make a templated class for the entire implementation: tempate class two_three_tree { public: two_three_tree(); void print_nicely(ostream & ostr); void insert(T item); T find(K key); bool remove(K key); ~two_three_tree(); }; protected: struct node { T data; node * ... etc ... } ... etc ... }; Of course you may add members and methods as you see fit. In that templated definition, T represents the whole objects that the tree contains. Assume it will always be a pointer type. K represents the key used for ordering the tree, it could be any type that supports the operators <, ==, and >. It is quite likely that objects of type T will contain have a member of type K, but not not certain. The only thing you can be sure of is that objects of type T will have a method called key() that returns a suitable value of type K. Along with the code and test runs, also submit your planning diagrams: pictures showing how the insert and remove operations work.