根据上面文章的启发,我自己想了一道题。
假设二叉树的节点中的数值都是正数,求某层节点数之和。根节点是第一层。如果不存在这一层,返回-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的情况。