У меня есть двоичное дерево поиска, и я хочу скопировать узлы в массив с inorder (рекурсивная функция) - PullRequest
3 голосов
/ 19 января 2010

Привет, у меня есть дерево двоичного поиска BST

typedef struct Treenode *SearchTree;
struct  Treenode
{
    int Element;
    SearchTree Left;
    SearchTree Right;
};

и я хочу создать функцию

FillArray(int sizeoftree, tree, int array[])

И я хочу использовать массив и скопировать узлы дерева в массиве. Как я могу это сделать? следующий код не работает. Я попробовал:

int FillArray(int a,SearchTree T,int arr[])
{
    if (T==NULL) 
    {   
       return 0; 
    }
    else
    { 
       FillArray(a,T->Left,arr);   
       arr[a]=T->Element;
       a++; 
       FillArray(a,T->Right,arr);
    } 
}

Ответы [ 3 ]

1 голос
/ 19 января 2010

FillArray объявлено как возвращающее int, но у вас нет возвращаемого значения в случае else.

Это возвращаемое значение можно использовать для обозначения количества заполненных элементов;Таким образом, вы знаете, где разместить текущий элемент по порядку.

int FillArray(int a, SearchTree T, int arr[]) {
    int count = 0;

    if (T) {
        count += FillArray(a, T->Left, arr);
        arr[a + count++] = T->Element;
        count += FillArray(a + count, T->Right, arr);
    }

    return count;
}
1 голос
/ 19 января 2010

Ваша проблема в том, что ваша функция FillArray только изменяет свой аргумент a, который невидим для вызывающей стороны, поскольку передача аргумента в C происходит по значению.Вам потребуется какой-то способ, чтобы рекурсивные вызовы указывали место в arr, в которое нужно добавить элементы.Один простой способ сделать это - добавить параметр, скажем, index, который дает первый индекс в arr, к которому нужно добавить элемент, и вернуть из FillArray количество добавленных элементов, чтобы вы могли правильнообновить index после рекурсивного вызова FillArray и вернуть общее количество добавленных элементов.

0 голосов
/ 19 января 2010

должен передать по ссылке

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