Проблема с вашим кодом в том, что вы пропускаете неправильный узел в рекурсивных вызовах. Предположим, например, что ваш элемент меньше, чем все в дереве. Затем при первом рекурсивном вызове вы получите следующее утверждение:
Node<T> left = root.Left;
return(contains(root, item));
Это означает, что вы выполняете рекурсию на корне 1005 *, а не на левом дочернем элементе. Таким образом, на следующей итерации вы обнаружите, что элемент меньше правого дочернего элемента корня, и поэтому вы снова будете выполнять точно такой же оператор, рекурсивно вызывая одну и ту же функцию несколько раз, пока не закончится место в стеке.
Чтобы исправить это, вы должны изменить приведенный выше код на
Node<T> left = node.Left;
return(contains(left, item));
Это говорит о том, что нужно искать левое поддерево текущего узла, а не сам корневой узел. Точно так же вам нужно обновить соответствующий регистр для правой ветви.
Наконец, чтобы закончить, вам нужно добавить базовый регистр в вашу рекурсивную функцию, которая обрабатывает случай, когда дерево имеет значение null
, либо потому, что вы вышли из дерева, либо дерево было пустым для начинается с. Я оставлю это как упражнение. : -)