【问题标题】:Determine average of all Node values within a Tree Structure确定树结构中所有节点值的平均值
【发布时间】:2015-12-22 04:12:52
【问题描述】:

给定这个界面...

public static interface Node 
{
    int getValue();
    List<Node> getChildren();
}

实现以下方法以返回树中所有节点值的平均值。

public static double getAverage(Node root) 
{
}   

我在这个练习题上遇到了非常困难的问题,并且有几个问题。

  1. 我认为最好使用递归来完成,对吗?
  2. 如果没有辅助方法或全局变量,这是否可行?
  3. 这是否可能无需遍历树两次? (一次用于节点总和,一次用于节点计数)

另外,如果有人能提供一些伪代码,我将不胜感激。

【问题讨论】:

  • 所有三个问题的答案都是“是”;现在,您可以编辑您的问题并添加您已经尝试过的代码吗?
  • 所以我可以为这个问题创建一个递归解决方案,而无需添加任何辅助方法或全局变量,也无需遍历树两次?
  • @CODE 如果您的意思是仅使用在您的问题中显示签名的getAverage 方法,那么答案很可能是否定的。知道每个子树的平均值是不够的:我们需要知道其中的节点数或总和。
  • @kraskevich 确实,这也是我的假设

标签: java recursion tree


【解决方案1】:
  1. 您可以使用递归,但也可以不使用递归来解决此问题。您需要的只是深度优先搜索。您可以使用堆栈迭代地实现它。

  2. 是的,这是可能的。带有堆栈的版本不需要任何额外的方法。

  3. 是的,这是可能的。您可以在一次遍历中计算这两个值。

这是一个非递归实现的伪代码:

valuesSum = 0
nodesCount = 0
stack = new Stack
stack.add(root)
while (!stack.isEmpty())
    Node v = stack.poll()
    nodesCount++
    valuesSum += v.getValue()
    for (child : v.getChildren())
        stack.add(child)
return valuesSum / nodesCount

【讨论】:

  • #2 和#3 是否基于迭代方法?我假设带有堆栈的版本不会是递归的。
  • @CODE #3 适用于任何方法。如果您使用递归版本,则可以从辅助函数返回一个包含总和和节点数的对象。 #2 基于迭代版本。
  • 我明白了,非常感谢您的解释和代码。
猜你喜欢
  • 2020-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-25
  • 2018-07-19
  • 1970-01-01
  • 1970-01-01
  • 2015-05-15
相关资源
最近更新 更多