двоичное дерево c ++ перестает правильно генерировать на полпути - PullRequest
0 голосов
/ 21 мая 2018

Я пытаюсь сгенерировать двоичное дерево из целочисленного массива.Дерево генерируется правильно для первой половины, однако на полпути через узлы генерации перестают связываться друг с другом по неизвестной причине.

Вывод программы выглядит следующим образом.Левый столбец указывает на следующее нижнее число.Средний столбец - это само число.Правый столбец указывает на следующее большее число.Каждая строка индексируется 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;
    }

}
...