求和二叉树级别

时间:2014-06-18 06:27:31

标签: java

我正在尝试按级别遍历二叉树,然后对每个级别中保存在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)

2 个答案:

答案 0 :(得分:1)

如果我不得不猜测,可能countdown不能保持正确的值;但是,鉴于代码中的许多变量未定义,很难确切地知道故障的位置。

如果countdown出错,内循环最终会清空队列。如果发生这种情况,您将获得n = null,并且尝试致电n.datan.leftn.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。所以最终结果窗台需要验证。