应该使用什么类型的遍历来查找二叉树的总和?

时间:2013-02-27 03:57:54

标签: algorithm binary-tree depth-first-search tree-traversal

以下问题出现在几年前我的导师给出的测试中。他提供了答案,但没有提供令人满意的解释。我用谷歌搜索了这个话题,但我找不到多少。我希望社区可以帮助我理解这个概念。

  

为了找到二叉树中所有整数的总和,将使用什么类型的遍历?

  (A)广度优先   (B)深度优先顺序
  (C)深度优先订购后   (D)深度优先预订

我的导师说答案是(C)深度优先的后期订单,但我不明白为什么。看起来他们都会工作。我很感激您的任何见解。

感谢。

编辑: 我终于想出了为什么我的导师认为答案是(C)。

如果您要在一个语句中添加all函数来编写sum函数,例如:

    int addup(Node n)
    {
        if (n == nil) return 0;
        return addup(n.left) + n.value + addup(n.right);
    }

无论总和中的术语顺序如何,遍历都将是后序。这是因为在添加之前首先评估两个函数。然而,正如基思·兰德尔在答案中所表明的那样,强制进行预购或有序遍历是微不足道的。

1 个答案:

答案 0 :(得分:3)

任何遍历顺序都可以,因为sum是关联的和对称的。例如,深度优先顺序:

int addup(Node n) {
    if (n == nil) return 0;
    int sum = addup(n.left);
    sum += n.value;
    sum += addup(n.right);
    return sum;
}

所有遍历都承认一个简单的实现。