Как удалить наное дерево?у каждого узла есть родительский указатель - PullRequest
1 голос
/ 23 февраля 2012

Структура узла ниже.

struct node
{
   int data;
   int noofchilds;
   node *child[n];
   node *parent;
 };

Буду признателен за рекурсивный и нерекурсивный подходы.

Ответы [ 3 ]

1 голос
/ 23 февраля 2012

нерекурсивная версия:

struct node {
    struct node *parent;
    unsigned nchild;
    struct node *child[XXX];
    int data;
    };

void deltree(struct node *np)
{
struct node *par;

while (np) {
        /* if this node has any children, start by
        ** "descending" to the highest numbered child and kill that first.
        */
        if (np->nchild--) {
                np = np->child[np->nchild];
                continue;
                }
        /* when we arrive here, *np has no more children left,
        ** so kill it, and step up to its parent
        */
        par = node->parent;
        // if np->child was obtained via malloc() uncomment next line
        // free (np->child);
        free (np);
        np = par;
        }
return;
}
0 голосов
/ 23 февраля 2012

Итерационный алгоритм:

Start at the parent node.

Then do the following actions as long as possible:
   if the current node has one or more children: 
      set one of the children nodes as the (next) current node
   else
      delete the current node and use its parent as the (next) current node.
      if the current node was the root node (which has no parent), stop.
0 голосов
/ 23 февраля 2012

Удалите узел и рекурсивно удалите его дочерние элементы.

Если вам нужно удалить полное дерево (как кажется, ваш вопрос), родительский указатель не имеет значения (и удаляется при удалениисам узел).

...