Прекрасный код, но повторение не идет дальше
item.left = insertNode(item.left, d);
item.right = insertNode(item.right, d);
И начальный рут не обновляется:
root = insertNode(root, d);
Остальная часть или окончательный возврат излишни.
Нечто в стиле кода
insertNode
имеет узел в качестве входных данных и возвращает обновленное значение узла, поэтому вызов "pattern" должен выглядеть как
X = insertNode(X, d); // X is some expression
Это потому, что java никогда не может присваивать переданному выражению аргумента: у него нет передачи по ссылке, но передача по значению; f(x)
никогда не присваивается x
.