Основы двоичного дерева

Я выполняю задачу leet code, которая называется бинарным наклоном. Ссылка на вопрос здесь: https://leetcode.com/problems/binary-tree-tilt/description/

Я застрял в вопросе, поэтому взглянул на решение и надеялся, что кто-то сможет интерпретировать части приведенного ниже решения для меня:

    public class Solution {
      int result = 0;

      public int findTilt(TreeNode root) {
        postOrder(root);
        return result;
      }

      private int postOrder(TreeNode root) {
        if (root == null) return 0;

        int left = postOrder(root.left);
        int right = postOrder(root.right);

        result += Math.abs(left - right);

        return left + right + root.val;
      }
  }
  1. целые числа left и right устанавливаются в значение каждый раз, когда происходит рекурсия. Я не понимаю, откуда взялось это значение, поскольку я думал, что нужно будет использовать метод root.val. Можете ли вы объяснить это в терминах непрофессионала?

  2. Когда метод postOrder возвращает left + right + rootval, куда возвращается метод? Как это используется с рекурсивным методом?

Отлаживайте его или, что еще лучше, для понимания стека вызовов рекурсии отрисовки.

Sergei Sirik 19.09.2018 22:35
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
1
57
1

Ответы 1

Я думаю, что вас сбивает с толку то, что вычисление суммы левого и правого поддерева и вычисление наклона для каждого узла объединены в одном методе. Итак, я упростил код, который вы предоставили, чтобы его было легче понять, и добавил к нему комментарии. Хотя этот способ намного менее эффективен, потому что вы вычисляете сумму для левого и правого поддерева каждого узла (при каждом вызове calculateTilt), но он все равно принимается leetcode:

public class Solution {
    int result = 0; //instance variable to accumulate result(tilt) for all nodes in the tree

    public int findTilt(TreeNode root) {
        calculateTilt(root);
        return result;
    }

    private void calculateTilt(TreeNode root) {
        if (root == null) 
            return;

        int left = findTreeSum(root.left); //find sum of all nodes values of the left subtree
        int right = findTreeSum(root.right); //find sum of all nodes values of the right subtree

        result += Math.abs(left - right); //add tilt of current node to the result

        calculateTilt(root.left); //recursively calculate tilt for the left subtree
        calculateTilt(root.right); //recursively calculate tilt for the right subtree
    }

    //method to find sum of all nodes values for the tree starting at root
    private int findTreeSum(TreeNode root){
        if (root == null) 
            return 0;

        return findTreeSum(root.left) + findTreeSum(root.right) + root.val;    
    }
}

Надеюсь, это поможет!

Другие вопросы по теме