Возникли проблемы с сортировкой листьев в порядке возрастания для двоичного дерева - PullRequest
0 голосов
/ 08 марта 2020

Итак, исходная проблема - написать метод chechkLeaves (), который должен возвращать true, если листья дерева отсортированы в порядке возрастания, и false в противном случае. Вы можете предположить, что данные для всех внутренних узлов являются нулевыми. Вы найдете полезным определить дополнительные рекурсивные вспомогательные методы для этой проблемы.

Редактировать: Мой код работает сейчас, но как я могу изменить код так, чтобы значение val передавалось как параметр, а не как глобальная переменная?

   static int val = 0;
      static public boolean checkLeaves(Node root) {
         // int val = 0;
          if(root.data != 0 ) {
              if(root.data > val) {
                  val = root.data;
                  return true;
              } else {
                  return false;
              }
          } else {
              return checkLeaves(root.left) && checkLeaves(root.right);

          }
      }

1 Ответ

1 голос
/ 08 марта 2020

На самом деле у вас нет возможности выполнить этот обход листьев со сравнением без глобальной переменной. Это то, что может быть достигнуто с помощью передачи по ссылке, но 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. Сделайте привычкой делать вещи частными по привычке, а затем расширять их модификаторы по мере необходимости.

...