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
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");
}
}
aW1wb3J0IGphdmEudXRpbC5MaXN0OwppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKCmNsYXNzIElkaW9tMTcKewoJc3RhdGljIGNsYXNzIFRyZWU8SyxWPiB7CgkJSyBrZXk7CgkJViBkZWNvOwoJCUxpc3Q8VHJlZTxLLFY+PiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8PigpOwoJCQoJCVRyZWUoSyBrZXksIFYgZGVjbykgewoJCQl0aGlzLmtleSA9IGtleTsKCQkJdGhpcy5kZWNvID0gZGVjbzsKCQl9CgkJCgkJVHJlZTxLLFY+IGFkZENoaWxkKEsga2V5LCBWIGRlY28pIHsKCQkJVHJlZTxLLFY+IGNoaWxkID0gbmV3IFRyZWU8PihrZXksIGRlY28pOwoJCQl0aGlzLmNoaWxkcmVuLmFkZChjaGlsZCk7CgkJCXJldHVybiBjaGlsZDsKCQl9CgkJCgkJQE92ZXJyaWRlCgkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKCQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CgkJCXNiLmFwcGVuZCgiKCIpOwoJCQlzYi5hcHBlbmQoZGVjbyk7CgkJCWlmKGNoaWxkcmVuLmlzRW1wdHkoKSkgewoJCQkJc2IuYXBwZW5kKCIpIik7CgkJCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKCQkJfQoJCQlzYi5hcHBlbmQoIiAoIik7CgkJCWZvcihUcmVlPEssVj4gY2hpbGQ6IGNoaWxkcmVuKQoJCQkJc2IuYXBwZW5kKGNoaWxkKTsKCQkJc2IuYXBwZW5kKCIpKSIpOwoJCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKCQl9Cgl9CgkKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKQoJewoJCVRyZWU8U3RyaW5nLCBTdHJpbmc+IHRyZWUgPSBuZXcgVHJlZTw+KCJHcmFucGEiLCAiQWJyYWhhbSIpOwoJCVRyZWU8U3RyaW5nLCBTdHJpbmc+IHN1YnRyZWUgPSB0cmVlLmFkZENoaWxkKCJEYWQiLCAiSG9tZXIiKTsKCQlzdWJ0cmVlLmFkZENoaWxkKCJLaWQgMSIsICJCYXJ0Iik7CgkJc3VidHJlZS5hZGRDaGlsZCgiS2lkIDIiLCAiTGlzYSIpOwoJCXN1YnRyZWUuYWRkQ2hpbGQoIktpZCAzIiwgIk1hZ2dpZSIpOwoJCQoJCVN5c3RlbS5vdXQucHJpbnRsbih0cmVlKTsKCX0KfQ==