So far, we've been writing trait bounds as a where clause, but there are two alternative ways of writing them. The where clause is nice because it's somewhat out of the way, allowing us to write even complex trait bounds without interfering with reading the rest of the function or data type declaration.
The first alternative is to put the trait bounds alongside the generic type parameter names, like this:
impl<K: PartialOrd + PartialEq, V> TreeNode<K, V> {
For a standalone function, that technique looks like this:
fn print_generic<T: Display>(value: T) {
This can be good for data types or functions that only have simple trait bounds, but we can see that even with just two required traits, the TreeNode implementation block is getting a little hard to read. The trait bound kind of breaks up the flow and makes us...