На самом деле у вас нет возможности выполнить этот обход листьев со сравнением без глобальной переменной. Это то, что может быть достигнуто с помощью передачи по ссылке, но Java не имеет такой функции. Итак, у вас есть два варианта:
Вариант 1) Придерживайтесь этой переменной c.
Вариант 2) Марка val
параметр в виде массива, как таковой:
private static public boolean checkLeaves(Node root, int[] val) {
if (root.data != 0) {
if (root.data > val[0]) {
val[0] = root.data;
return true;
} else {
return false;
}
} else {
return checkLeaves(root.left, val) && checkLeaves(root.right, val);
}
}
И для его вызова:
checkLeaves(root, new int[] { Integer.MIN_VALUE });
Сделав его массивом, вы можете эмулировать это поведение «передача по ссылке». То есть, обновляя исходное значение переменной, имея ссылку на исходное значение. Все в Java передается по значению, поэтому значение переменной передается параметру, а не ссылке на него.
Примечание
Я предлагаю вам назвать ваши переменные a немного более описательный. Например, вместо val
вы могли бы назвать его previousLeafValue
или как-то еще.
Кроме того, хорошей практикой, которой нужно следовать, является сделать все как можно более "приватным". В варианте 2 вы можете увидеть, что у моего кода есть метод с модификатором частного доступа. То же самое верно для вашей переменной stati c. Сделайте привычкой делать вещи частными по привычке, а затем расширять их модификаторы по мере необходимости.