Здравствуйте, я ищу способ рекурсивно назначить позиции дерева индексу 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)
}
, как я пытаюсь напечатать мой массив я получаю первых два значения назначено правильно, то тогда большой блок нулей без значений (которые подтверждены в дереве) не в дереве.
Я ищу сделать это, чтобы выяснить наименьший размер массива, который мне понадобится после удаления внутри дерева.
Обновления для массива поиска в ширине:
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;
}
Нормальный рекурсивный способ обработки деревьев здесь не будет работать. Я думаю, что вам нужно сделать, пока вы обрабатываете 1-й уровень, сохраняете список дел с уровнями 2-го уровня для обработки. Затем перейдите в этот список и, обрабатывая его, сохраните список дел уровня 3. Затем, когда вы закончите с уровнем 2, просмотрите список узлов уровня 3 и т. Д. Или вы можете сохранить все в одной очереди. Посмотрите «обход дерева» в Википедии и прокрутите вниз до «поиска по ширине». – ajb
@ajb Я добавил свой текущий поиск по ширине. –