У меня есть один отсортированный массив int
и одно дерево avl. Данные массива - это исходный набор данных, а дерево формируется из элементов массива. Необходимо получить список элементов в дереве, которые отсутствуют или добавлены в исходный массив, и сделать дерево похожим на массив, удалив или добавив элемент в дерево.
Пример 1:
int orig[5] = {10, 20, 25, 30, 40};
ref_tree = 10, 20, 25, 30, 35, 40, 50
Delete from tree: 35, 50
Пример 2:
int orig[6] = {10, 20, 25, 30, 35, 40};
ref_tree = 10, 20, 25, 35
Add to tree : 30, 40
ПРИМЕЧАНИЕ. Если длина массивов и количество узлов дерева одинаковы, то предположим, что оба имеют одинаковый список элементов.
Я пробовал что-то вроде этого:
'''
if (array_len < node_count) {
/*Extra element in ref array */
while(tree_node) {
//iterate through all nodes of tree
bool found = false;
for (int i=0; i<array_len; i++) {
if (tree_node->data == orig[i]) {
found = true;
break;
}
}
if (found == false) {
//Data is extra in tree, so delete node to make it similar.
}
}
} else {
/*Missing element from tree */
for (i=0; i<orig_len; i++) {
/* Calling tree find api if element is available or not*/
if (find(orig[i], ref_tree) == false) {
//Element is Missing
//add that node from tree to make it similar
}
}
}
'''
Я хочу оптимизировать код здесь.
Вместо того, чтобы выполнять операцию поиска каждый раз при поиске отсутствующих элементов, можно ли что-нибудь сделать, чтобы сделать код более эффективным?
Зацикливание несколько раз в случае обнаружения дополнительных элементов в дереве, возможно ли объединиться в один цикл и оптимизировать код любым другим способом?
Вместо 'if-else', возможно ли иметь общую логику, которая может обрабатывать, чтобы получить элемент, который будет добавлен / удален из дерева?