Разница между двумя рекурсивными алгоритмами для удаления двоичного дерева поиска

голоса
0

У меня есть вопрос об этих двух алгоритмов:

Это работает нормально:

node* deleteTree(node* root)
{
    if(root != NULL)
    {
       deleteTree(root->left);
       deleteTree(root->right);
       deallocateNode(root);
    }
    return root=NULL;
}

Это Нету:

void deleteTree(node* root)
{
   if(root != NULL)
   {
      deleteTree(root->left);
      deleteTree(root->right);
      deallocateNode(root);
   }
   root=NULL;
}

Зачем? Мне нужно установить , rootчтобы nullтаким образом указатель узла после удаления из BST не будет указывать на память не выделяется. Я предпочитаю второй алгоритм , поскольку отзыв функции является более интуитивным.

Теоретически, два алгоритма эквивалентен, но если я использую второй алгоритм, и я пытаюсь напечатать BST, программа переходит в петле.

Задан 14/04/2017 в 11:35
источник пользователем
На других языках...                            


1 ответов

голоса
2

Если у вас есть node *rootи присвоить node = NULLэто не повлияет на его стоимость в экстерьере. Если вы хотите изменить значение указателя, вам придется пройти двойной указатель.

Что-то вроде:

void deleteTree(node** root)
{
   if(*root != NULL)
   {
      deleteTree(&((*root)->left));
      deleteTree(&((*root)->right));
      deallocateNode(*root);
   }
   *root = NULL;
}

Но я не думаю , что на самом деле вам нужно назначить , node = NULLтак как вы освободите его. Таким образом, вы можете просто назначить node = NULLпосле вызова deleteTree и вам не придется возиться с двойным указателем.

Ответил 14/04/2017 в 11:47
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more