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