维基百科的这段左翼树代码是否正确?

时间:2010-05-06 20:34:52

标签: java reference leftist-tree

Link

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 个答案:

答案 0 :(得分:1)

它正在切换它们以用于方法内的后续执行。虽然交换机不会直接在方法外部更改任何引用,但是检查完成后,代码中只有一条逻辑路径,较小的元素值始终位于x节点中,因此它们在代码中稍后进行交换使用正确的元素。

对于一个具体示例,请查看下一行代码:

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

两者中较小的一个(x或y)将合并在它下面,在它的右边,两个中较大的一个。因此,这允许方法本身担心排序,并且意味着可以按任何顺序添加这两个元素,并且因此会发生正确的行为。

希望这有帮助。

答案 1 :(得分:0)

  

从那以后就不会那样   引用只是切换   在方法里面?

方法的其余部分将对切换的引用进行操作,使交换机非常有意义。