Как обратиться к дереву в рекурсивной функции - PullRequest
0 голосов
/ 06 июля 2018

У меня уже есть двоичное дерево (не сбалансированное), и у каждого узла уже есть * команда, связанная с ним. Однако, когда я пытаюсь превратить дерево в массив, возникает проблема с адресом в TreeToVector(Teamtree->Left,...). Как мне это решить?

typedef struct
{
    char *team;

}Team;

typedef struct Hash_tree *TreePointer;

typedef struct Hash_tree
{
        TreePointer Right;
        TreePointer Left;
        Team T;
}Hash_tree;

void TreeToVector(Hash_tree **Teamtree, Team *t, int sizeofarray, int i)
{
    if(Teamtree == NULL) return;
    else
    {
        t[i].team = (*Teamtree)->T.team;
        i++;
    if(Teamtree->Left != NULL && i < sizeofarray)
             i = TreeToVector(Teamtree->Left, t, sizeofarray, i);
    if(Teamtree->Right != NULL && i < size)
             i = TreeToVector(Teamtree->Right, t, sizeofarray, i);

    }
}

В main.c:

Team t[size];
TreeToVector(Teamtree, t, size, 0);

Ответы [ 2 ]

0 голосов
/ 06 июля 2018
int TreeToVector(TreePointer tree, Team *t, int sizeofarray, int i)
{
    if(tree == NULL) return i;

    t[i++].team = tree->T.team;

    // Travel left tree
    if(i < sizeofarray)
             i = TreeToVector(tree->Left, t, sizeofarray, i);

    // Travel right tree
    if(i < sizeofarray)
             i = TreeToVector(tree->Right, t, sizeofarray, i);

    // Return current index of t
    return i;
}
0 голосов
/ 06 июля 2018

Поскольку вы не возвращаете новое значение, ваш i сбрасывается при переходе вверх и вниз по уровням. Вы можете вернуть его или другим способом сделать его static и сбросить его каким-либо образом при первом входе в функцию (или просто оставить ее вне функции). Или передайте его как указатель, чтобы вы могли обновить то же значение.

Например, если вы берете случай, когда первый узел имеет левое и правое, вы можете ясно видеть, что то же самое i будет передано на вызовы TreeToVector, если вы не измените его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...