1 /*  permute.c  */
2 
3 #include "../Tree.h"
4 
5 /*--------------------------------------------------------------------*/
6 /*
7    -----------------------
8    return a permuted tree
9 
10    created -- 96jan04, cca
11    -----------------------
12 */
13 Tree *
Tree_permute(Tree * tree,int newToOld[],int oldToNew[])14 Tree_permute (
15    Tree   *tree,
16    int    newToOld[],
17    int    oldToNew[]
18 ) {
19 int    n, u_old, v_new, v_old, w_old ;
20 Tree   *tree2 ;
21 /*
22    ---------------
23    check the input
24    ---------------
25 */
26 if (  tree == NULL || (n = tree->n) <= 0
27    || newToOld == NULL || oldToNew == NULL ) {
28    fprintf(stderr, "\n fatal error in Tree_permute(%p,%p,%p)"
29            "\n bad input\n", tree, newToOld, oldToNew) ;
30    exit(-1) ;
31 }
32 /*
33    -----------------
34    create a new tree
35    -----------------
36 */
37 tree2 = Tree_new() ;
38 Tree_init1(tree2, n) ;
39 /*
40    ---------------
41    fill the fields
42    ---------------
43 */
44 for ( v_new = 0 ; v_new < n ; v_new++ ) {
45    v_old = newToOld[v_new] ;
46    if ( (w_old = tree->par[v_old]) != -1 ) {
47       tree2->par[v_new] = oldToNew[w_old] ;
48    }
49    if ( (u_old = tree->fch[v_old]) != -1 ) {
50       tree2->fch[v_new] = oldToNew[u_old] ;
51    }
52    if ( (u_old = tree->sib[v_old]) != -1 ) {
53       tree2->sib[v_new] = oldToNew[u_old] ;
54    }
55 }
56 if ( tree->root != -1 ) {
57    tree2->root = oldToNew[tree->root] ;
58 }
59 
60 return(tree2) ; }
61 
62 /*--------------------------------------------------------------------*/
63