Я пытаюсь сгенерировать двоичное дерево из целочисленного массива.Дерево генерируется правильно для первой половины, однако на полпути через узлы генерации перестают связываться друг с другом по неизвестной причине.
Вывод программы выглядит следующим образом.Левый столбец указывает на следующее нижнее число.Средний столбец - это само число.Правый столбец указывает на следующее большее число.Каждая строка индексируется 0 - 9:
1 5 2
-1 1 3
5 8 6
4 4 -1
-1 2 7
-1 6 8
-1 9 -1
-1 3 -1
-1 7 -1
-1. Отсутствует дальнейшая ссылка, что не имеет никакого смысла, поскольку, например, номер 6 должен ссылаться на номер 3.
#include <iostream>
#define SIZE 9
#define RIGHT 1
#define LEFT 0
struct Node {
int num;
int left;
int right;
};
int is_cont(struct Node n, int side) {
if (side == RIGHT) {
if (n.right == -1) {return 0;}
else {return 1;}
} else if (side == LEFT) {
if (n.left == -1) {return 0;}
else {return 1;}
}
}
int main() {
int ls[SIZE] = {5,1,8,4,2,6,9,3,7};
int tree_len;
int tree_current = 0;
Node tree[SIZE] = {-1,-1,-1,0};
tree[0].num = ls[0];
tree_len = 1;
for (int i = 1; i < SIZE; i++) {
for(int o = 0; o < tree_len; o++) {
if (ls[i] > tree[tree_current].num) {
if (is_cont(tree[tree_current], RIGHT)) {
tree_current = tree[tree_current].right;
continue;
} else {
tree[i] = {ls[i],-1,-1};
tree[tree_current].right = i;
tree_current = 0;
tree_len++;
break;
}
} else { //if ls[i] < tree[tree_current].num]
if (is_cont(tree[tree_current], LEFT)) {
tree_current = tree[tree_current].left;
continue;
} else {
tree[i] = {ls[i],-1,-1};
tree[tree_current].left = i;
tree_current = 0;
tree_len++;
break;
}
}
} //END OF SECOND FOR LOOP
} //END OF FIRST FOR LOOP
for (int i = 0; i < SIZE; i++) {
std::cout << tree[i].left << " " << tree[i].num << " " << tree[i].right << std::endl;
}
}