import java.util.List;
import java.util.ArrayList;

class Idiom17
{
	static class Tree<K,V> {
		K key;
		V deco;
		List<Tree<K,V>> children = new ArrayList<>();
		
		Tree(K key, V deco) {
			this.key = key;
			this.deco = deco;
		}
		
		Tree<K,V> addChild(K key, V deco) {
			Tree<K,V> child = new Tree<>(key, deco);
			this.children.add(child);
			return child;
		}
		
		@Override
		public String toString() {
			StringBuilder sb = new StringBuilder();
			sb.append("(");
			sb.append(deco);
			if(children.isEmpty()) {
				sb.append(")");
				return sb.toString();
			}
			sb.append(" (");
			for(Tree<K,V> child: children)
				sb.append(child);
			sb.append("))");
			return sb.toString();
		}
	}
	
	public static void main (String[] args)
	{
		Tree<String, String> tree = new Tree<>("Granpa", "Abraham");
		Tree<String, String> subtree = tree.addChild("Dad", "Homer");
		subtree.addChild("Kid 1", "Bart");
		subtree.addChild("Kid 2", "Lisa");
		subtree.addChild("Kid 3", "Maggie");
		
		System.out.println(tree);
	}
}