二叉树某层节点之和

根据上面文章的启发,我自己想了一道题。
假设二叉树的节点中的数值都是正数,求某层节点数之和。根节点是第一层。如果不存在这一层,返回-1。
最简单的写法如下:

private static int cnt = 0;

public void sumOfLevel(BinaryTreeNode root, final int level, int cur) {
    if (root == null) {
        return;
    }
    if (cur == level) {
        cnt += root.value;
        return;
    }

    if (root.left != null) {
        sumOfLevel(root.left, level, cur + 1);
    }

    if (root.right != null) {
        sumOfLevel(root.right, level, cur + 1);
    }
}

cur的初始值是1。
但这种写法需要写两个方法,另一个返回cnt。能不能只写一个方法呢?

public int sumOfLevel(BinaryTreeNode root, final int level, int cur) {
    if (root == null) {
        return -1;
    }
    if (cur == level) {
        return root.value;
    }

    int leftValue = sumOfLevel(root.left, level, cur + 1);
    int rightValue = sumOfLevel(root.right, level, cur + 1);
    if (leftValue < 0 && rightValue < 0) {
        return -1;
    }
    leftValue = leftValue < 0 ? 0 : leftValue;
    rightValue = rightValue < 0 ? 0 : rightValue;
    return leftValue + rightValue;
}

2019-02-26再阅:
拿到题目写出了下面一段代码

    int sum(BinaryTreeNode root, final int level, int cur) {
        if (root == null || cur > level) {
            return 0;
        }
        int value = 0;
        if (cur == level) {
            value = root.value;
        }
        return value + sum(root.left, level, cur + 1) 
                + sum(root.right, level, cur + 1);
    }

这段代码非常简洁,算法是二叉树的后序遍历。但是如果该层不存在,返回0,这一点是不符合题意的。如果想用这段代码,需要提前计算 树的高度,先判断层次是否存在,不过这样太不优雅。

    int sum(BinaryTreeNode root, final int level, int cur) {
        if (root == null || cur > level) {
            return -1;
        }
        if (cur == level) {
            return root.value;
        }

        int left = sum(root.left, level, cur + 1);
        int right = sum(root.right, level, cur + 1);
        if (left < 0 && right < 0) {
            return -1;
        }
        left = left < 0 ? 0 : left;
        right = right < 0 ? 0 : right;
        return left + right;
    }

sum()表示以root为根节点,cur层的和。
如果cur=height,那么直接返回root.value即可,不需要继续递归。这样就避免了cur > height的情况。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容