2013-11-09 3 views
0

Я хотел бы написать функцию, переставляющую массив следующим образом. Учитывая бинарное дерево, как этот (в шестнадцатеричном поддерживать симметрию):Перенастройка массива, двоичное дерево, обратное отслеживание

0 
     1 
    2  3 
    4 5 6 7 
8 9 A B C D E F 

Я хотел бы получить номер следующего алгоритма обратного прослеживания:

[0,1,2,4,8,9,5,A,B,3,6,C,D,7,E,F] 

Я уже написал функцию C, но я уверен, что есть более чистый/более быстрый рекурсивный способ сделать это. Вот мой код:

void bin_perm(float* data, float* bprm, size_t size) { 
    bprm[0] = data[0]; 
    size_t j = 1; 
    size_t i = 1; 
    while (j < size) { 
     while (i < size) { 
      bprm[j++] = data[i]; 
      i *= 2; 
     } 
     i = i/2 + 1; 
     while (i % 2 == 0) { 
      i /= 2; 
     } 
    } 
} 

ответ

2
void bin_perm_recur(float* data, size_t data_idx, float* bprm, size_t* bprm_idx_ptr, size_t size) 
{ 
    bprm[(*bprm_idx_ptr)++] = data[data_idx]; 
    if (data_idx * 2 < size) 
     bin_perm_recur(data, data_idx * 2, bprm, bprm_idx_ptr, size); 
    if (data_idx * 2 + 1 < size) 
     bin_perm_recur(data, data_idx * 2 + 1, bprm, bprm_idx_ptr, size); 
} 

void bin_perm(float* data, float* bprm, size_t size) 
{ 
    bprm[0] = data[0]; 
    size_t j = 1; 
    bin_perm_recur(data, 1, bprm, &j, size); 
} 
+0

Спасибо! Он работает отлично. Я задаюсь вопросом, не так ли ленивая мысль. ;-) – matovitch

Смежные вопросы