Обход предзаказа BST и запись содержимого дерева во временный массив - PullRequest
4 голосов
/ 05 июля 2010

Я пытаюсь записать содержимое двоичного дерева поиска во временный массив, чтобы использовать его в main. Однако я не уверен, как это сделать ... Я пробовал что-то вроде этого:

void Book::preorder(TreeNode *ptr, Person &temp[], int x)
{

 if(ptr!=NULL)
 {
  temp[x].name=ptr->item.name;
  x++;
  preorder(ptr->left, temp, x);
  preorder(ptr->right, temp, x);
 }

}

И, это дает следующие ошибки:

объявление 'temp'a как массива ссылок

нет совпадения для 'operator []' in '((Книга *) this-> Book :: temp [x]'

нет соответствующей функции для вызова 'Book :: preorder (TreeNode * &, Person &, INT &) '

Ответы [ 3 ]

2 голосов
/ 05 июля 2010
void Book::preorder(TreeNode *ptr, Person temp[])
{
    if(ptr!=NULL)
    {
        temp[globX].name=ptr->item.name;
        temp[globX].phoneNumber=ptr->item.phoneNumber;
        globX++;
        preorder(ptr->left, temp);
        preorder(ptr->right, temp);
    }

}

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

2 голосов
/ 05 июля 2010

Попробуйте это:

void Book::preorder(TreeNode *ptr, Person temp[], int x)
{

 if(ptr!=NULL)
 {
  temp[x].name=ptr->item.name;
  x++;
  preorder(ptr->left, temp, x);
  preorder(ptr->right, temp, x);
 }

}
1 голос
/ 03 мая 2015

Возможно, уже слишком поздно, но я считаю, что здесь стоит указать. То, что вышеупомянутые ответы предлагают здесь, относится исключительно к сериализации двоичного (поискового) дерева. Представьте, что вы хотите восстановить дерево позже, учитывая его сериализованную версию. Вы должны разметить листья, чтобы при попытке перестроить дерево было ясно, какой узел является дочерним по отношению к другому. Для этого просто добавьте NULL-ссылки в массив (или список) при обнаружении конечного узла. Однако при переходе на один уровень вверх добавьте еще одну NULL-ссылку на массив. Другими словами, перед возвратом из каждой рекурсии просто добавьте NULL в массив, который был передан методу. Таким образом, любое движение на один уровень вверх приведет к вставке NULL в массив. При восстановлении списка добавляйте элементы в стек, когда вы читаете их из массива слева направо. Нажав на пустую ссылку, вы выталкиваете () самый верхний объект из стека и оставляете следующий peek () стека, чтобы указать на него как на одного из его дочерних элементов. Перейдите к следующему элементу в массиве и повторите ту же процедуру. Возможно, есть более эффективные способы дальнейшей оптимизации этого подхода, но это то, что я хотел упомянуть. Надеюсь, это поможет.

...