import java.util.List;
import java.util.ArrayList;
import java.util.function.Consumer;
 
class Idiom16
{
	static class BinTree<T extends Comparable<T>> {
        T value;
        BinTree<T> left;
        BinTree<T> right;

        BinTree(T value) {
            this.value = value;
        }
 
		@Override
		public String toString() {
			StringBuilder sb = new StringBuilder();
			sb.append("(");
            sb.append(value);
			sb.append(" ");
            sb.append(left==null ? "()" : left);
            sb.append(right==null ? "()" : right);
			sb.append(")");
			return sb.toString();
		}

        void dfs(Consumer<BinTree<T>> f) {
            if( left != null )
                left.dfs(f);
            f.accept(this);
            if( right != null )
                right.dfs(f);
        }
	}
 
	public static void main (String[] args)
	{
        BinTree<Integer> five = new BinTree<>(5);
        BinTree<Integer> one = new BinTree<>(1);
        BinTree<Integer> eight = new BinTree<>(8);
		BinTree<Integer> six = new BinTree<>(6);
        five.left = one;
        five.right = eight;
        eight.left = six;

        Consumer<BinTree<Integer>> finder = new Consumer<BinTree<Integer>>() {
            @Override
            public void accept(BinTree<Integer> bt) {
                System.out.println("Found " + bt.value);
            }
        };
        five.dfs(finder);
	}
}