Удалите все узлы в двоичной тройке, которые не лежат ни на одном пути с суммой>= k

Не в состоянии понять ответ дан ЗДЕСЬ Может кто-нибудь, пожалуйста, помогите понять.

Мой Алго:

Рекурсивно найти сумму каждого пути. Если сумма>=k, поместите все узлы в пути в хэш-набор. В конце переберите дерево, удалите узлы, которых нет в хэш-наборе.

Я уверен, что здесь есть много возможностей для улучшения.

2 ответа

Решение

У вас есть дерево, и вы рекурсивно анализируете его так:

go_node(Node node){
  go_node(node.left);
  go_node(node.right);
}

В вашем примере вы хотите удалить любое поддерево, значение которого меньше заданного числа. Решение простое, мы немного изменим нашу простую функцию и проблема будет решена. Я позволил "K" быть глобальной переменной, чтобы сделать этот код максимально простым. Однако вы можете проанализировать его и в методе go_node.

int go_node(Node node, int value){
  this.total_value = value;
  total_value += go_node(node.left, value);
  if (node.left.total_value < K){
     node.left = null;
  }
  total_value += go_node(node.right, value);
  if (node.right.total_value < K){
     node.right = null;
  }
  return total_value;
}

Почему я теперь могу их удалить? Когда какое-либо значение возвращается из левого или правого поддерева, это поддерево "закончено", оно обрабатывается и, что важно, - это дает мне добавление всего этого поддерева. Поэтому, когда total_value этого узла меньше K, это означает, что ЭТОТ узел и ВСЕ дочерние элементы этого узла (и дочерние элементы дочерних элементов и т. Д.) Меньше K. Причина, когда дочерний элемент поддерева возвращает мне значение, которое имеет этот дочерний элемент в total_value. сохранено значение всего поддерева.

Подход состоит в том, чтобы пройти по дереву и удалить узлы снизу вверх. Обходя дерево, рекурсивно рассчитайте сумму узлов от корневого до конечного узла каждого пути. Для каждого посещенного узла проверяется общая рассчитанная сумма по отношению к заданной сумме "k". Если сумма меньше, чем k, то освободите (удалите) этот узел (конечный узел) и верните сумму обратно на предыдущий узел.

public int removeNodesUtil(Node node, int sum, int k)
{
    if (node == null) return sum;

    sum =sum + node.data;
    if (node.left == null && node.right == null) 
    {
        if (sum < k)
        {
            node = null;
        }
        return sum;
    }
    int leftSum = 0, rightSum = 0, maxSum = 0;

    if (node.left != null) {
        leftSum = removeNodesUtil(node.left, sum, k);
        if (leftSum < k) {
            node.left = null;
        }
    }

    if (node.right != null) {
        rightSum = removeNodesUtil(node.right, sum, k);
        if (rightSum < k) {
            node.right = null;
        }
    }
    maxSum = Math.max(leftSum, rightSum);
    if (maxSum < k) {
        node = null;
    }
    return maxSum;
}
Другие вопросы по тегам