Правильно ли этот фрагмент кода левого дерева из Википедии?

Ссылка на сайт

public Node merge(Node x, Node y) {
  if(x == null)
    return y;
  if(y == null) 
    return x;

  // if this was a max height biased leftist tree, then the 
  // next line would be: if(x.element < y.element)
  if(x.element.compareTo(y.element) > 0) {  
    // x.element > y.element
    Node temp = x;
    x = y;
    y = temp;
  }

  x.rightChild = merge(x.rightChild, y);

  if(x.leftChild == null) {
    // left child doesn't exist, so move right child to the left side
    x.leftChild = x.rightChild;
    x.rightChild = null;
    x.s = 1;
  } else {
    // left child does exist, so compare s-values
    if(x.leftChild.s < x.rightChild.s) {
      Node temp = x.leftChild;
      x.leftChild = x.rightChild;
      x.rightChild = temp;
    }
    // since we know the right child has the lower s-value, we can just
    // add one to its s-value
    x.s = x.rightChild.s + 1;
  }
  return x;
}

Что заставляет меня задать этот вопрос:

  if(x.element.compareTo(y.element) > 0) {  
    // x.element > y.element
    Node temp = x;
    x = y;
    y = temp;
  }

Разве это не сработает, поскольку ссылки переключаются только внутри метода?

2 ответа

Решение

Это переключение их для целей последующих исполнений внутри метода. Хотя переключатель не изменяет никаких ссылок непосредственно за пределами метода, проверка выполняется таким образом, чтобы в коде был только один путь логики, при этом элемент с меньшим значением всегда находился в узле x, так что их замена позже в коде работает с правильными элементами.

Для одного конкретного примера посмотрите на следующую строку кода:

x.rightChild = merge(x.rightChild, y);

Какой из двух меньших из них (x или y) будет сливаться под ним, у его правого потомка больше двух. Таким образом, это позволяет самому методу беспокоиться об упорядочении и означает, что два элемента могут быть добавлены в любом порядке, и из-за этого произойдет правильное поведение.

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

Разве это не сработает, поскольку ссылки переключаются только внутри метода?

Остальная часть метода будет работать с переключенными ссылками, что делает переключение весьма значимым.

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