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...
答案 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队列,你绝对可以使用自己的队列。