Java 树中所有节点的平均值中的OutOfMemory错误 公共类节点{ int值; 列出子节点; 节点(int x){ 值=x; childNodes=新的ArrayList(); } }

Java 树中所有节点的平均值中的OutOfMemory错误 公共类节点{ int值; 列出子节点; 节点(int x){ 值=x; childNodes=新的ArrayList(); } },java,tree,out-of-memory,binary-tree,Java,Tree,Out Of Memory,Binary Tree,这是节点的定义 public class Node { int value; List<Node> childNodes; Node(int x) { value = x; childNodes = new ArrayList<>(); } } 公共静态双平均节点(节点根){ int numofnodes=0; 整数和=0; 堆栈s=新堆栈(); s、 添加(根); 而(!s.isEmpty()){ 节点n=s.pop();

这是节点的定义

public class Node {

  int value;
  List<Node> childNodes;

  Node(int x) {
      value = x;
      childNodes = new ArrayList<>();
  }
}
公共静态双平均节点(节点根){
int numofnodes=0;
整数和=0;
堆栈s=新堆栈();
s、 添加(根);
而(!s.isEmpty()){
节点n=s.pop();
numofnodes++;
总和+=n.值;
用于(节点温度:root.childNodes){
s、 推送(温度);//第1行
}
}
返回和/数量节点;
}

我使用带有堆栈的深度优先搜索遍历树。但是,当我在eclipse中单击run时,第1行显示了一条错误消息“Exception in thread”main“java.lang.OutOfMemoryError:java堆空间”。有人知道如何修复代码以避免此错误吗?

您不能总是添加
根节点的子节点,而是添加
n
节点的子节点:

 public static double averageNodes(Node root) {
      int numofnodes = 0;
      int sum = 0;
      Stack<Node> s = new Stack<Node>();
      s.add(root);
      while (!s.isEmpty()) {
          Node n = s.pop();
          numofnodes++;
          sum += n.value;
            for (Node temp : root.childNodes) {
              s.push(temp);  // Line 1
          }
      }
      return sum / numofnodes;
  }
由于总是一次又一次地添加
根节点
的子节点,因此编码会导致无限循环和无限增长的堆栈


取出一个元素,放入所有子元素,取出,放入所有子元素,等等。这只是一个很小的错误,但其原因却相当严重。

但我可以构建一个非常简单的树结构,主要只有9个节点,这就是我测试它的方式。
for (Node temp : n.childNodes) {
    s.push(temp);  // Line 1
}