interface Node<K> { K key() ; List<Node<K>> children () } class Branch<K> implements Node<K> { K key; K key() { return this.key; } Node<K> left ; Node<K> right; List<Node<K>> children() { return new Arrays.asList (new Node<K>[left, right]); } } class Leaf<K> implements Node<K> { .. }