数组的排列,二叉树,回溯

时间:2013-11-09 16:21:13

标签: c algorithm binary-tree

我想用以下方式编写一个置换数组的函数。 给出像这样的二叉树(用十六进制来保持对称性):

 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;
        }
    }
}

1 个答案:

答案 0 :(得分: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);
}