Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在二叉树中应用逐级函数,参数为级别的第一个元素_C_Binary Tree_Breadth First Search - Fatal编程技术网

C 在二叉树中应用逐级函数,参数为级别的第一个元素

C 在二叉树中应用逐级函数,参数为级别的第一个元素,c,binary-tree,breadth-first-search,C,Binary Tree,Breadth First Search,使用宽度优先树遍历时,如何在二叉树中的每个节点上调用函数?此外,函数需要一个参数来告诉它当前节点是否是当前级别的第一个节点 我已经测试了我的代码,但它似乎做得不对,两个节点中的一个被认为是每个级别上的第一个节点。代码如下: int btree_level_count(t_btree *root) { int lvl_left; int lvl_right; if (!root) return (0); lvl_left = btree_level_count(root-

使用宽度优先树遍历时,如何在二叉树中的每个节点上调用函数?此外,函数需要一个参数来告诉它当前节点是否是当前级别的第一个节点

我已经测试了我的代码,但它似乎做得不对,两个节点中的一个被认为是每个级别上的第一个节点。代码如下:

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]++;
  }
}
intbtree\u level\u count(t\u btree*root)
{
左一级整数;
int lvl_右;
如果(!root)
返回(0);
左层=树级计数(根->左);
层右=树级计数(根->右);
返回(1+lvl\U左>lvl\U右?lvl\U左:lvl\U右);
}
void btree_applyf(t_btree*root,int lvl[2],int f_elt,void(*applyf)(void*item,int lvl,int is_first元素))
{
如果(!root)
返回;
如果(lvl[0]==lvl[1])
applyf(root->item,lvl[0],f_elt);
其他的
{
lvl[1]++;
btree_applyf(根->左,层,1,applyf);
btree_applyf(根->右,左,0,applyf);
}
}
按级别(t_btree*根,void(*applyf)(void*项,int当前级别,int为第一元素))应用void btree\u
{
内部高度;
int-lvl[2];
如果(!root)
返回;
高度=b树\水平\计数(根);
lvl[0]=0;
lvl[1]=0;
而(层[0]<高度)
{
btree_applyf(根,层,1,applyf);
lvl[0]++;
}
}

我对每个函数的参数数量使用任意限制,因此数组表示级别和当前级别。

我不理解最后一句话的目的/意义。为什么是数组,为什么是任意限制?如果节点是级别中的“第一个”,则只需进行遍历并进行一些额外的计算,对吗?还有,这里的“第一”是什么意思?第一是指最左边的那个。该限制由分配施加(其他限制,如每个函数25行,每个文件5个函数)