c 预序二叉树遍历的解释



好的伙计们,我想知道我在此代码中所做的以下评论。谢谢

void visit(tree_t *t){
    printf("%c ", t->e + 'A'); // why t->e + 'A', and not just t->e?
}
void tree_preorder(tree_t *t, void (*visit)(tree_t *)){ // i just don't know the parameter void (*visit)(tree_t *). what exactly is (*visit)(tree_t *)?
    if (!t) return; // what's the condition (!t)?
    visit(t);
    tree_preorder(t->l, visit);
    tree_preorder(t->r, visit);
}

以下是三个问题的概要。

printf("%c ", t->e + 'A'); // why t->e + 'A', and not just t->e?

这是在做出 ascii 表假设。

这将使角色移动0x41 (65)。因此,如果你有一个 int 范围为 0 - 25 的树,你可以打印出一个有效的字符 A - Z

(*visit)(tree_t *)

这是一个函数指针。它将在每个节点上调用

// what's the condition (!t)?

这是一个空检查,以确保您不在树结构中的叶节点上。

t->e 可能在 0-26 范围内。通过算术添加"A"字符,您可以得到 0 的"A",1 的 1 的"B",依此类推。

void (*visit)(tree_t *)参数是指向函数的函数指针,该函数将tree_t指针作为参数并返回 void。

void (*visit)(tree_t *)
是一个指向函数的指针,

该函数不返回任何内容,并将指向tree_t的指针作为单独的参数。

!t

是检查指向NULL的指针的最优选方法之一。这意味着您已经到达树中的叶节点,您需要停止递归(基本情况)。

添加'A'可能类似于我们在

if (isdigit(ch))
    ch = ch-'0';

最新更新