Удалить дерево файлов, если оно заполнено с помощью C - PullRequest
0 голосов
/ 21 августа 2011

Напишите программу на C для удаления дерева.

Я написал небольшой фрагмент кода для достижения этой цели, но он входит в бесконечный цикл

void deleteTree(struct tnode *root)
{
 cout<<root->data<<endl;
 if( root->lchild == NULL && root->rchild == NULL)
   delete(root);

 deleteTree(root->lchild);
 deleteTree(root->rchild);
 //return root;
}  

Я хочу удалитьэто при прохождении.Я знаю, что можно использовать Post Post Traversal.Но может быть какая-то другая идея или нет?

Ответы [ 4 ]

4 голосов
/ 21 августа 2011

Бесконечный цикл?Это должно быть нарушение прав доступа ака SIGSEGV на самом деле.При удалении конечного узла вы просто вызываете delete(root), но затем не возвращаетесь.Таким образом, следующие два рекурсивных вызова deleteTree все еще выполняются (таким образом вызывая SIGSEGV, потому что root должен быть недействительным).Либо добавьте return; после delete(root), либо используйте это:

void deleteTree(struct tnode *root)
{
  cout<<root->data<<endl;

  if (root->lchild != NULL)
    deleteTree(root->lchild);
  if (root->rchild != NULL)
    deleteTree(root->rchild);
  delete(root);
}

, это также сохранит один вызов функции из-за ранней проверки ребенка.

2 голосов
/ 21 августа 2011

Вероятно, вы должны выполнить обход по порядку, который удаляет дочерние элементы, а затем удаляет корень.Может быть:

void deleteTree(struct tnode *root)
{
    if (root != NULL)
    {
        // ?? delete root->data ??
        deleteTree(root->lchild);
        deleteTree(root->rchild);
        delete root;
    }
}

Если вы предпочитаете избегать рекурсивных вызовов, когда указатель равен нулю, вы можете проверить каждый дочерний элемент на нулевое значение, прежде чем вызывать deleteTree() рекурсивно.Тогда вы можете заменить существующий тест if утверждением, хотя вам придется беспокоиться о том, что вас попросят удалить пустое дерево (когда при первоначальном вызове deleteTree() указан нулевой указатель).

1 голос
/ 21 августа 2011

Подсказка: следует ли вам действительно звонить deleteTree(root->lchild);, когда нет левого ребенка, или deleteTree(root->rchild);, когда нет правого ребенка? Как вы думаете, что это связано с бесконечной рекурсией?

Кроме того: Вы не должны сначала удалять узел, а затем возвращаться к его дочерним элементам - потому что после удаления узла он больше не существует, и вы больше не можете использовать root (то, что он работает для вас, - чистая удача ).

1 голос
/ 21 августа 2011

Это не должен быть бесконечный цикл, но он неправильный, потому что root-> lchild может быть нулевым, в то время как правые потомки не равны null, когда вы удаляете Tree (root-lchild)

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