我正在从 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 中似乎是不可能的。