Правильно ли этот фрагмент кода левого дерева из Википедии? - PullRequest
1 голос
/ 07 мая 2010

Ссылка

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 ]

1 голос
/ 07 мая 2010

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

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

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

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

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

0 голосов
/ 07 мая 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...