将二叉搜索树展平为列表

时间:2015-12-10 17:25:07

标签: c binary-tree binary-search-tree breadth-first-search

typedef struct node *blah;

int *breath_search(struct node *root){

    int *numbers = calloc(20,sizeof(*numbers)); int listpointer = 0;
    struct node **currentlist = calloc(20,sizeof(struct node*));
    struct node **updatedlist = calloc(20,sizeof(struct node*));
    currentlist[0] = root;
    int iterations = 1;

    int depths = 3;
    while(depths){


        int i = 0; int j;
        for(j=0;j<iterations;j++){
            if(currentlist[j] == NULL){
                updatedlist[i] = NULL; i++;
                updatedlist[i] = NULL; i++;
                numbers[listpointer] = 0; listpointer++;
            }
            else if(currentlist[j] != NULL){
                updatedlist[i] = currentlist[j]->left; i++;
                updatedlist[i] = currentlist[j]->right; i++;
                numbers[listpointer] = (int) alpabatise(currentlist[j]->newitem.key); listpointer++;
            }
        }

        currentlist = updatedlist;
        updatedlist = (blah[])     {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};
        iterations = iterations*2;

        depths--;

    }

    return numbers;
}

我一直在看这段代码好几个小时,为什么它不起作用也没有意义。 我打算给函数一个节点,它会向我返回一个指针,其中包含二进制树中所有数字的列表。

我的二叉树就像

        231
     /      \
    82      247
   /  \     /  \
  80  137 NULL 263

我的函数只返回指向列表

的指针
231,82,247,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

我期待

231,82,247,80,137,0,263,0,0,0,0,0,0...

1 个答案:

答案 0 :(得分:2)

我相信代码中的错误是行::

updatedlist = (blah[]) {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};

我怀疑这是一个有效的语法。因为,您正在尝试分配一个新数组,您可以在其中保存刚访问过的节点的子节点,建议calloc一个新数组,然后您可以在代码中使用该数组。

因此,上面提到的那一行应该改为这个::

updatedlist = calloc(20,sizeof(struct node*));

为了释放不再使用的内存,你应该考虑的几点,同时释放不再使用的内存,因为C不会明确地为你做,你需要自己照顾,以免造成任何内存泄漏。 因为,在while循环的每次迭代之后,currentList都是无用的,您应该添加一个语句(在将updatedList分配给currentList之前)

free(currentList);

在程序结束时也释放updatedList

其次,您当前正在做的事情就像二叉树的级别顺序遍历。因此,您可以尝试使用STL queue,并且不需要像您一样创建和交换数组。像这样的东西::

int *breath_search(struct node *root){

    int *numbers = calloc(20,sizeof(*numbers));
    int listpointer = 0;
    queue<node*> q;
    q.push(root);
    int iterations = 1;

    int depths = 3;
    while(depths){
        int i = 0, j;
        for(j=0; j<iterations; j++){
            node* currentNode = q.pop();
            if(currentNode == NULL){
                q.push(NULL);
                q.push(NULL);
                numbers[listpointer] = 0;
                listpointer++;
            }
            else if(currentNode != NULL){
                q.push(currentNode->left);
                q.push(currentNode->right);
                numbers[listpointer] = (int) alpabatise(currentlist[j]->newitem.key);
                listpointer++;
            }
        }
        iterations = iterations*2;
        depths--;
    }
    return numbers;
}

我相信这是一个更好的方法,因为你不必继续分配和释放内存,所以它减少了开销。我使用STL队列,你绝对可以使用自己的队列。