我正在尝试按级别遍历二叉树,然后对每个级别中保存在levelSum中的每个节点中保存的整数求和。然后,我想将levelSum乘以我所处的级别数,并将其添加到totalSum中。当我运行它时,我在第15行得到一个NullPointException,但我无法弄清楚原因。
public int depthSum() {
Queue<IntTreeNode> q = new LinkedList<IntTreeNode>();
int totalSum = 0;
int levelSum = 0;
int multiplier = 1;
int nodesPerLevel = 0;
if(overallRoot != null) {
q.offer(overallRoot);
nodesPerLevel += 1;
while(!q.isEmpty()) {
int countDown = nodesPerLevel;
while(countDown > 0) {
countDown--;
IntTreeNode n = q.remove();
levelSum += n.data; //this is line 15
if(n.left != null) {
q.offer(n.left);
nodesPerLevel++;
}
if(n.right != null) {
q.offer(n.right);
nodesPerLevel++;
}
}
totalSum += (multiplier * levelSum);
levelSum = 0;
multiplier++;
}
}
return totalSum
}
这是堆栈跟踪:
NullPointerException on line 15:
java.lang.NullPointerException
at IntTree.depthSum (Line 15)
答案 0 :(得分:1)
如果我不得不猜测,可能countdown
不能保持正确的值;但是,鉴于代码中的许多变量未定义,很难确切地知道故障的位置。
如果countdown
出错,内循环最终会清空队列。如果发生这种情况,您将获得n = null
,并且尝试致电n.data
,n.left
或n.right
会获得NullPointerException
。
以下是我认为您尝试做的类似版本(Ideone example here):
public int depthSum(IntTreeNode root) {
if(root == null) throw new NullPointerException();
Queue<IntTreeNode> q = new LinkedList<IntTreeNode>();
q.add(root);
int siblings = 1;
int totalSum = 0, levelSum = 0, level = 0;
while(!q.isEmpty()) {
IntTreeNode n = q.remove(); // Only remove one node per loop
levelSum += n.data;
if(n.left != null) // Add left child
q.add(n.left);
if(n.right != null) // Add right child
q.add(n.right);
if(--siblings == 0){ // All siblings have been probed
siblings = q.size(); // All remaining Nodes are siblings
totalSum += levelSum * level; // increment totalSum
level++; // increment level
levelSum = 0; // reinitialize levelSum
}
}
return totalSum;
}
答案 1 :(得分:-1)
NullPointException的要点应该是nodesPerLevel不能重置为0; countDown应该大于队列大小并导致q.remove抛出NullPointException。
nodesPerLevel应该在countDown = nodesPerLevel之后重置为0。
此代码段看起来无法编译,例如tempSum看起来是levelSum。所以最终结果窗台需要验证。