【问题标题】:Permutation of an array, binary tree, backtracking数组的排列,二叉树,回溯
【发布时间】:2013-11-21 14:13:53
【问题描述】:

我想编写一个按以下方式排列数组的函数。 给定一棵像这样的二叉树(以十六进制表示以保持对称性):

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

【问题讨论】:

    标签: c algorithm binary-tree


    【解决方案1】:
    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);
    }
    

    【讨论】:

    • 谢谢!它完美地工作。我想知道SO是否不会让我懒惰地思考。 ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    • 2013-04-17
    • 2018-10-20
    • 1970-01-01
    相关资源
    最近更新 更多