Java 如何找到节点的和';如果树不完整,给定深度的s值?

Java 如何找到节点的和';如果树不完整,给定深度的s值?,java,binary-tree,depth,Java,Binary Tree,Depth,我以前也问过类似的问题,应该说得更详细一些。 上一次是PHP中的“如何在二叉树中找到给定深度的节点值之和” 所以现在我试着用Java写这个。Java抛出nullPointerException。原因是下面的代码无法处理树不完整的情况 public int getNodeValueByDepth(Node n, int level) { if(level == 0) { return n.data; }

我以前也问过类似的问题,应该说得更详细一些。 上一次是PHP中的“如何在二叉树中找到给定深度的节点值之和”

所以现在我试着用Java写这个。Java抛出nullPointerException。原因是下面的代码无法处理树不完整的情况

    public int getNodeValueByDepth(Node n, int level) {

            if(level == 0) {
                return n.data;
            }
            else {
                return getNodeValueByDepth(n.left, level-1) + 
                       getNodeValueByDepth(n.right, level-1);
            }
    }
我的测试树结构是:

/*
         * construct tree
         *                                    sum of node's value   
         *              5          depth 0 ==> 5
         *             / \               
         *           3    10       depth 1 ==> 13
         *          / \   / \
         *         2  4   6  11    depth 2 ==> 23
         *               / \
         *              7   9      depth 3 ==> 16
         *            
         *                         depth 4 ==> null
         *           
         */
所以,当我调用getNodeValueByDepth(root,3)时,它是7+9,它会抛出和null指针异常错误。我试图添加逻辑来处理节点left和right为null的情况,但仍然无法找出如何处理,而且如果不解决这个问题,我就无法入睡

谁能给我一个提示吗?我尝试了,但没有,它只返回0

public int getNodeValueByDepth(Node n, int level) {

        int sum = 0;

        if(level == 0) {
            return sum + n.data;
        }
        else if(n.left != null) {
            return sum += getNodeValueByDepth(n.left, level-1);
        }
        else if(n.right != null) {
            return sum += getNodeValueByDepth(n.right, level-1);
        }
        else {
            return sum + 0;
        }

    }

您的控制语句在每种情况下都使用
else
,因此只有一条语句得到评估。因此,如果它对左侧求值,则返回时不会对右侧求值

public int getNodeValueByDepth(Node n, int level) {
    int sum = 0;

    /** If we have reached our desired level */
    if (level == 0) {
        if (n != null) {
            /** Assuming data is an int and not nullable */
            return n.data;
        } else {
            /** Change this to 0 if you don't want an error condition */
            return -1;
    }

    /** We are not the desired level, so get the sum of .left and .right, knowing either may not exist */
    if (n.left != null) {
        sum += getNodeValueByDepth(n.left, level-1);
    }

    if (n.right != null) {
        sum += getNodeValueByDepth(n.right, level-1);
    }

    /** Now have evaluated every possible child and stored the sum, even if it is 0 */
    return sum;
}

注意:检查语法错误,我是在没有Java的机器上写的

在最后一个示例中,去掉最后一个“Else”,让它返回总和,而不管前面的条件是否成功,它都应该工作。

当我调用getNodeValueByDepth(root,3)时,它返回了9,但我想我们更接近了。。现在检查更多细节..啊!对不起,我认为我的示例树结构有缺陷,7应该是9的子级。所以你的代码是正确的。
public int getNodeValueByDepth(Node n, int level) {
    int sum = 0;

    /** If we have reached our desired level */
    if (level == 0) {
        if (n != null) {
            /** Assuming data is an int and not nullable */
            return n.data;
        } else {
            /** Change this to 0 if you don't want an error condition */
            return -1;
    }

    /** We are not the desired level, so get the sum of .left and .right, knowing either may not exist */
    if (n.left != null) {
        sum += getNodeValueByDepth(n.left, level-1);
    }

    if (n.right != null) {
        sum += getNodeValueByDepth(n.right, level-1);
    }

    /** Now have evaluated every possible child and stored the sum, even if it is 0 */
    return sum;
}