从特定深度的二叉树的元素创建链接列表
我正在尝试构建一个链表,其元素处于一定的深度
我想出了这个:
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
。 这样,您不必取消引用指针的指针以达到指针值。