c预编码二叉树遍历的解释

时间:2012-05-02 17:54:00

标签: c syntax

好的,伙计们,我想知道我在这段代码中发表的以下评论。谢谢,

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);
}

3 个答案:

答案 0 :(得分:2)

这是三个问题的缩写。

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)?

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

答案 1 :(得分:1)

可能t-> e在0-26的范围内。通过算术地添加'A'字符,你得到'A'代表0,'B'代表1,等等。

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

答案 2 :(得分:0)

void (*visit)(tree_t *)

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

!t

是检查指向NULL的指针的最佳方法之一。这意味着您已到达树中的叶节点,您需要停止递归(base case)。

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

中的操作
if (isdigit(ch))
    ch = ch-'0';