Skip to content
Snippets Groups Projects
cs_post.c 1.07 KiB
Newer Older
  • Learn to ignore specific revisions
  • Lubomir Riha's avatar
    Lubomir Riha committed
    #include "cs.h"
    /* post order a forest */
    CS_INT *cs_post (const CS_INT *parent, CS_INT n)
    {
        CS_INT j, k = 0, *post, *w, *head, *next, *stack ;
        if (!parent) return (NULL) ;                        /* check inputs */
        post = cs_malloc (n, sizeof (CS_INT)) ;                /* allocate result */
        w = cs_malloc (3*n, sizeof (CS_INT)) ;                 /* get workspace */
        if (!w || !post) return (cs_idone (post, NULL, w, 0)) ;
        head = w ; next = w + n ; stack = w + 2*n ;
        for (j = 0 ; j < n ; j++) head [j] = -1 ;           /* empty linked lists */
        for (j = n-1 ; j >= 0 ; j--)            /* traverse nodes in reverse order*/
        {
            if (parent [j] == -1) continue ;    /* j is a root */
            next [j] = head [parent [j]] ;      /* add j to list of its parent */
            head [parent [j]] = j ;
        }
        for (j = 0 ; j < n ; j++)
        {
            if (parent [j] != -1) continue ;    /* skip j if it is not a root */
            k = cs_tdfs (j, k, head, next, post, stack) ;
        }
        return (cs_idone (post, NULL, w, 1)) ;  /* success; free w, return post */
    }