/*  permute.c  */

#include "../Tree.h"

/*--------------------------------------------------------------------*/
/*
   -----------------------
   return a permuted tree

   created -- 96jan04, cca
   -----------------------
*/
Tree *
Tree_permute (
   Tree   *tree,
   int    newToOld[],
   int    oldToNew[]
) {
int    n, u_old, v_new, v_old, w_old ;
Tree   *tree2 ;
/*
   ---------------
   check the input
   ---------------
*/
if (  tree == NULL || (n = tree->n) <= 0 
   || newToOld == NULL || oldToNew == NULL ) {
   fprintf(stderr, "\n fatal error in Tree_permute(%p,%p,%p)"
           "\n bad input\n", tree, newToOld, oldToNew) ;
   exit(-1) ;
}
/*
   -----------------
   create a new tree
   -----------------
*/
tree2 = Tree_new() ;
Tree_init1(tree2, n) ;
/*
   ---------------
   fill the fields
   ---------------
*/
for ( v_new = 0 ; v_new < n ; v_new++ ) {
   v_old = newToOld[v_new] ;
   if ( (w_old = tree->par[v_old]) != -1 ) {
      tree2->par[v_new] = oldToNew[w_old] ;
   }
   if ( (u_old = tree->fch[v_old]) != -1 ) {
      tree2->fch[v_new] = oldToNew[u_old] ;
   }
   if ( (u_old = tree->sib[v_old]) != -1 ) {
      tree2->sib[v_new] = oldToNew[u_old] ;
   }
}
if ( tree->root != -1 ) {
   tree2->root = oldToNew[tree->root] ;
}

return(tree2) ; }

/*--------------------------------------------------------------------*/


syntax highlighted by Code2HTML, v. 0.9.1