从特定深度的二叉树的元素创建链接列表

我正在尝试构建一个链表,其元素处于一定的深度

我想出了这个:

void nivel(ABin a, int k, SList *l, int level){ if (!a) return; if(k == level){ SList n = (SList)malloc(sizeof(struct slist)); n->value = a->value; n->next=(*l); (*l) = n; return; }else{ nivel(a->left, k, l, level+1); nivel(a->right, k, l, level+1); } } 

它确实有效

但是练习要求使用这个标题: SList nivel(ABin a,int n)

我尝试过无效练习。 但无法弄清楚如何制作返回链表的那个。

结构和二叉树中的数据:

 typedef struct slist { int value; struct slist* next; } *SList; typedef struct arvbin* ABin; typedef struct arvbin { int value; ABin right; ABin left; } arvb; 

编辑:

//感谢Politank-Z

 SList nivel_(ABin a, int k){ SList *l; nivel(a, k, l, 1); return l; } void nivel(ABin a, int k, SList *l, int level){ if (!a) return; if(k == level){ SList n = (SList)malloc(sizeof(struct slist)); n->value = a->value; n->next=(*l); (*l) = n; return; }else{ nivel(a->left, k, l, level+1); nivel(a->right, k, l, level+1); } } 

关于你对原型的困难:限制在一个不能满足你实现需求的函数原型是很常见的。 在这种情况下,通常更容易从原型函数调用您的函数,然后将您的function变为原型。

你的意思是你想使用二叉树构建链表吗? 但是,您可以在(k == level)时将新项添加到列表中,然后调用nivel(a-> left,k,l,level + 1)。 它不会在这里添加任何节点,因为现在k!= level + 1,所以你的列表实际上只包含一个节点…

顺便说一句,你应该确保每次都有一个节点添加到你的列表中。

 } *SList; 

将创建一个名为SList的指针类型。 这会导致代码混淆,因为你使用SList *l这是一个指向指针的指针! 将struct typedef更改为just } SList 。 这样,您不必取消引用指针的指针以达到指针值。