【问题标题】:recursive printf of binary tree elements二叉树元素的递归printf
【发布时间】:2012-09-17 19:47:23
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

首先从左侧下降,然后打印节点本身,然后从右侧下降,是使此操作按顺序树遍历的原因。如果您按照您的建议在左下降之前移动printf,这将使其预购遍历。如果您先进行两次下降,那将是 post-order。所有这三种可能性都会访问所有节点,但以三种不同的顺序。

考虑简单的树

  *
 / \
a   +
   / \
  b   c

如果你按顺序遍历这棵树,你会得到

* a + b c

按顺序,

a * b + c

后订购,

a b c + *

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

【讨论】:

    【解决方案2】:

    当然它会“工作”。你只会在输出上得到不同的排序。您还可以在打印两个子节点之后打印节点。 (想象一下,如果你有一棵树有多个孩子,而不仅仅是两个。)

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

    【讨论】:

      【解决方案3】:

      您可以通过不同的方式遍历二叉树:预排序、中序和后序。

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

      因此,可以将 printf 视为其他类型的过程/函数的占位符,以处理不同类型的问题。

      【讨论】:

        猜你喜欢
        • 2016-07-17
        • 2016-04-19
        • 2014-03-29
        • 2010-12-07
        • 2020-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多