нерекурсивна версия:
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;
}
да, но если я хочу сделать это итеративно т.е. без использования стека или очереди, то, что может быть подход, Я думаю, что родительский указатель может принести нам пользу в то время – Peter
Обычно вы начинаете с корня, так как это единственный узел, в котором вы, как правило, также имеете прямой доступ ... и в этом случае родитель не нужен, поскольку вам нужно только «спуститься» вниз, ... Мне интересно, поможет ли итеративное решение. –
node = root; do { if (node-> noofchild) { node = node-> child [noofchild-1]; прочее { node-> parent-> noofchild -; curr = node-> parent; свободный (узел); node = curr; } } while (node-> parent || (node == root && node)) – Peter