我回到K& R阅读一章,并注意到我之前省略的一个例子。 本章介绍二叉树数据类型的主题。我知道在节点中存储新条目,但打印功能让我感到困惑。为什么首先打印左侧部分?
如果printf
是函数中的第一个命令,然后是左右,那么它会起作用吗?
如果不是 - 为什么呢?
/* treeprint: in-order print of tree p */
void treeprint(struct tnode *p)
{
if (p != NULL) {
treeprint(p->left);
printf("%4d %s\n", p->count, p->word);
treeprint(p->right);
}
}
答案 0 :(得分:9)
首先下降左侧,然后打印节点本身,然后下降右侧,这是使按顺序树遍历的操作。如果您按照建议在左下降之前移动了printf
,则会使其预订遍历。如果你先做两次下降,那将是后期订单。所有三种可能性都访问所有节点,但有三种不同的顺序。
考虑简单的树
*
/ \
a +
/ \
b c
如果您按预订遍历此树,则
* a + b c
在阶
a * b + c
后顺序,
a b c + *
您想要的其中一种可能性取决于您正在做什么。
答案 1 :(得分:1)
当然它会“奏效”。你只需要输出一个不同的顺序。您还可以在打印两个子节点后打印节点。 (想象一下,如果你有一个有多个孩子的树,而不仅仅是两个。)
真正的问题是树节点的值是否遵循任何特殊规则,因此任何特定的遍历顺序是否特别有意义。例如,对于binary search tree,左右自定义顺序按排序顺序打印出值。
答案 2 :(得分:0)
您可以通过不同方式浏览二叉树:预订,有序和后期订单。
printf可能是一个完全不同的过程(节点数据的计算)。有些问题需要在树上行走的方式不同,例如,如果你在平衡二叉树,你会在访问两个子树后计算平衡因子。
因此,printf可以被认为是处理各种问题的其他程序/功能的占位符。