二叉树元素的递归printf

时间:2012-09-17 19:47:24

标签: c binary-tree kernighan-and-ritchie

我回到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);
    }
}

3 个答案:

答案 0 :(得分:9)

首先下降左侧,然后打印节点本身,然后下降右侧,这是使按顺序树遍历的操作。如果您按照建议在左下降之前移动了printf,则会使其预订遍历。如果你先做两次下降,那将是后期订单。所有三种可能性都访问所有节点,但有三种不同的顺序。

考虑简单的树

  *
 / \
a   +
   / \
  b   c

如果您按预订遍历此树,则

* a + b c

在阶

a * b + c

后顺序,

a b c + *

想要的其中一种可能性取决于您正在做什么。

答案 1 :(得分:1)

当然它会“奏效”。你只需要输出一个不同的顺序。您还可以在打印两个子节点后打印节点。 (想象一下,如果你有一个有多个孩子的树,而不仅仅是两个。)

真正的问题是树节点的是否遵循任何特殊规则,因此任何特定的遍历顺序是否特别有意义。例如,对于binary search tree,左右自定义顺序按排序顺序打印出值。

答案 2 :(得分:0)

您可以通过不同方式浏览二叉树:预订,有序和后期订单。

printf可能是一个完全不同的过程(节点数据的计算)。有些问题需要在树上行走的方式不同,例如,如果你在平衡二叉树,你会在访问两个子树后计算平衡因子。

因此,printf可以被认为是处理各种问题的其他程序/功能的占位符。