0

我正在从 java 中的二叉树创建一个堆。我的实现如下所示:

public class Heap <P extends Comparable<P>,D> {
  // ATTRIBUTES
  private TreeNode<P,D> root;
  private int size;

  // CONSTRUCTOR
  PriorityQueue() {
    this.root = null;
    this.last = null;
    this.size = 0;
  }

  class TreeNode<P,D> {
    // ATTRIBUTES
    P priority;
    D data;
    TreeNode<P,D> left;
    TreeNode<P,D> right;

    // CONSTRUCTOR
    TreeNode(P priority, D data, TreeNode<P,D> left, TreeNode<P,D> right) {
      this.priority = priority;
      this.data = data;
      this.left = left;
      this.right = right;
    }
    TreeNode(P priority, D data) {
      this(priority, data, null, null);
    }
}

现在我想获取节点的第 n 个元素。我想,将 n 转换为二进制字符串会很聪明,弹出第一个 1,然后每个 0 向左移动,每个 1 向右移动。

这似乎不太难,但现在我的问题是,我应该如何创建一个输出,比如root.left.left.right到达第 9 个元素。我不只是想得到一个副本,这很容易(见getNode(int n)下面的函数),我想要一个对该节点的引用,所以我可以在那个地方添加一个新节点。

public TreeNode<P,D> getNode(int n) {
  String binString = Integer.toBinaryString(n);
  char[] binChars = binString.substring(1, binString.length()).toCharArray();
  TreeNode<P,D> node = this.root;
  for( char c : getNodePath(n) ){
    if( c == '0' ){
      node = node.left;
    } else if( c == '1' ){
      node = node.right;
    }
  }
  return node;
}

这在java中甚至可能吗?在 python 中,我只会创建一个".left.left.right"String 并使用run,但这在 java 中似乎是不可能的。

4

1 回答 1

0

您构建数据的方式,您需要的不是对节点 n 的引用(您已经获得),而是对其父节点的引用。

所以对于 .left.left.right

您需要切断最后一点并使用 .left.left 调用 getNode

这将为您提供节点的父节点。您可以通过使用返回的父节点并使用您切断的位(.right)来引用目标节点本身

父权

同样,您可以通过 parent.right = new-node 重新分配节点

顺便说一句,您不需要创建二进制字符串来实现您的方案。您只需要使用移位运算符和“按位与”

于 2014-06-29T20:33:25.240 回答