0

我正在尝试实现一种应该使二叉树完整的优化方法。我的方法是通过将树排序为int*,然后将数组的中点添加到新数组并在每一半上递归来实现这一点。

但是,代码实际输出的是在沿左树下降到最大深度后生成重复项:

16 8 4 2 1 0 0 3 3 6 5 5 7 7 12 10 9 9 11 11 14 13 13 15 15 24 20 18 17 17 19 19

我一生都无法弄清楚为什么会发生这种情况。

我的代码:

// bth is "binary tree helper [method]"
void bth_optimizearray(int* in, int* out, int min, int max, int* i) {
    // `in' is sorted, `out' should be optimized
    // `i' is the current index in `out'

    int len /* of subarray */ = max - min;
    if (len < 1) {
        // empty subarray
        return;
    }
    if (len == 1) {
        // just add it
        out[(*i)++] = in[min];
    } // else

    // Add the midpoint
    int midpos = min + ((max - min) >> 1);
    out[(*i)++] = in[midpos];
    bth_optimizearray(in, out, min, midpos, i);
    bth_optimizearray(in, out, midpos + 1, max, i);
}

void bt_optimize(bintree *tree) {
    int treesize = bt_size(tree);

    int *ordered = malloc(treesize * sizeof(int));
    {
        int i = 0;
        void visit(node *n) {
            ordered[i++] = n -> key;
        }
        bt_traverse(tree, INORDER, visit);
    }


    int *optimized = malloc(treesize * sizeof(int));
    {
        int *i = malloc(sizeof(int));
        (*i) = 0;
        bth_optimizearray(ordered, optimized, 0, treesize, i);
    }

    // Free all nodes (but don't call freetree; that would free the tree too)
    void freenode(node *n) {
        free(n);
    }
    bt_traverse(tree, INORDER, freenode);
    tree -> root = NULL;

    {
        int i;
        for (i = 0; i < treesize; i++) {
            printf("%d ", optimized[i]);
            bt_add(tree, optimized[i]);
        }
    }
}

在这段代码中,bintreeis astruct { node *root; int size; }和所有其他方法都可以正常工作。

完整的代码也在GitHub 上,但是这个bt_optimize方法只在optimize分支中。

这是 C,不是 C++。

有什么建议么?

4

2 回答 2

1

似乎当 min = max - 1 时,“out[(*i)++] 语句运行了两次。

if (len == 1) {
    // just add it
    out[(*i)++] = in[min];
    // -- Should place a "return;" here?
} // else

// Add the midpoint
int midpos = min + ((max - min) >> 1);
out[(*i)++] = in[midpos];
于 2013-09-10T06:45:26.770 回答
0

这段代码在我看来很可疑:

out[(*i)++]

原因是这样它会将“i”的值作为索引,然后它会增加该值。

为了证明这一点,我进行了测试。例子:

int index,value;
index = 10;

value = index++;//this way value will become 10 and index 11

index = 10;

value = ++index;//this way both become 11
于 2013-09-10T05:01:13.490 回答