使用广度优先树遍历时,如何在二叉树的每个节点上调用函数?此外,该函数需要一个参数来告诉它当前节点是否是当前级别的 first 节点。
我已经测试了我的代码,但似乎做得不对,两个节点中的一个被认为是每个级别上的第一个节点。这是代码:
int btree_level_count(t_btree *root)
{
int lvl_left;
int lvl_right;
if (!root)
return (0);
lvl_left = btree_level_count(root->left);
lvl_right = btree_level_count(root->right);
return (1 + lvl_left > lvl_right ? lvl_left : lvl_right);
}
void btree_applyf(t_btree *root, int lvl[2], int f_elt, void (*applyf)(void *item, int lvl, int is_first_elem))
{
if (!root)
return ;
if (lvl[0] == lvl[1])
applyf(root->item, lvl[0], f_elt);
else
{
lvl[1]++;
btree_applyf(root->left, lvl, 1, applyf);
btree_applyf(root->right, lvl, 0, applyf);
}
}
void btree_apply_by_level(t_btree *root, void (*applyf)(void *item, int current_level, int is_first_elem))
{
int height;
int lvl[2];
if (!root)
return ;
height = btree_level_count(root);
lvl[0] = 0;
lvl[1] = 0;
while (lvl[0] < height)
{
btree_applyf(root, lvl, 1, applyf);
lvl[0]++;
}
}
我对每个函数的参数数量使用了任意限制,因此数组代表了级别和当前级别。