您好我正在寻找一种方法来递归地将树的位置分配给一个int索引,这样就可以将该位置的节点值放入一个数组中。
所需的树位置按照水平顺序指定,其中根位置为1(i),i的左子节点位于2i,右子节点为2i + 1 - 类似于堆结构。无子女不会获得分配给他们的职位。
1
/ \
2 3
/\ /\
4 5 6 7
...
[1, 2, 3, 4, 5, 6, 7. ...]
树中最大的位置应该是数组的大小。将空值添加为"空格"我的输出需要测试节点值。
private int largestPos
// first call: assignPositions(root, 1)
assignPositions(node cur, int pos) {
parent = new node;
if curpos > largestPos
largestPos = curPos
if cur == null
parent.pos = pos
else
current.pos = pos
parent = cur
if cur.left != null
pos = 2 * pos
assignPositions(cur.left, pos)
if cur.right != null
pos = 2 * pos + 1
assignPositions(cur.right, pos)
}
当我尝试打印出我的数组时,我得到了正确分配的前两个值,然后一个没有值的大块空值(在树中已经确认)不在树中。
我希望这样做可以找出在树中删除后我需要的数组的最小大小。
更新breadthfirstsearch数组:
public Key[] breadthFirstTraversal() {
@SuppressWarnings("unchecked")
Key[] keysFinal = new Key[largestPos];
List<Key> queue = new List<Key>();
List<Key> keysList = new List<Key>();
List<Integer> positions = new List<Integer>();
if (!isEmpty()) {
Node tempNode = root;
KeyValuePair<Key, Value> tempKey = null;
queue.add(tempNode);
while (!queue.isEmpty()) {
queue.reset();
tempKey = queue.remove();
keysList.add(tempKey);
tempNode = findKey(tempKey.getKey(), root);
// adds keys in order on level in list
if (tempNode.getLeftChild() != null) {
queue = addAtEnd(queue, tempNode.getLeftChild());
}
if (tempNode.getRightChild() != null) {
queue = addAtEnd(queue, tempNode.getRightChild());
}
}
for (int i = 1; i < largestPos + 1; i++) {
keysList.reset();
tempKey = keysList.remove();
tempNode = findKey(, root);
if (tempNode.getPosition() == i) {
keysFinal[i - 1] = tempKey;
} else {
keysFinal[i - 1] = null;
}
}
}
return keysFinal;
}
答案 0 :(得分:0)
您正在将pos
更改为在左子树上工作,但随后希望原始值在右侧子树上工作。因此,请不要更改pos
,只需将所需的表达式放入assignPositions
的调用中。
然后,您继续为您访问的每个节点创建新节点,而且我没有看到任何阵列,因此问题不仅仅是那个。