题目地址:
https://www.lintcode.com/problem/binary-tree-level-sum/description
给定一棵二叉树,求其第 l l l层的节点和。
法1:DFS。如果是空树则返回 0 0 0;如果当前深度等于 l l l则返回其值,否则继续向更深的层次寻找。代码如下:
public class Solution {
/**
* @param root: the root of the binary tree
* @param level: the depth of the target level
* @return: An integer
*/
public int levelSum(TreeNode root, int level) {
// write your code here
return calculate(root, 1, level);
}
// cur表示当前root所在层数,level是要求的那层的层数
private int calculate(TreeNode root, int cur, int level) {
// 如果是空树则返回0
if (root == null) {
return 0;
}
// 如果当前层数就是所要求的层数,则返回其值,否则分别递归计算左右子树
if (cur == level) {
return root.val;
} else {
return calculate(root.left, cur + 1, level) + calculate(root.right, cur + 1, level);
}
}
}
class TreeNode {
int val;
TreeNode left, right;
TreeNode(int x) {
val = x;
}
}
时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( l ) O(l) O(l)。
法2:BFS。采取分层遍历的方法,遍历到 l l l层的时候开始计入和,然后跳出返回即可。代码如下:
import java.util.LinkedList;
import java.util.Queue;
public class Solution {
/**
* @param root: the root of the binary tree
* @param level: the depth of the target level
* @return: An integer
*/
public int levelSum(TreeNode root, int level) {
// write your code here
if (root == null) {
return 0;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
int cur = 1, res = 0;
while (!queue.isEmpty() && cur <= level) {
int size = queue.size();
for (int i = 0; i < size; i++) {
TreeNode x = queue.poll();
// 如果当前层数等于level,则开始计入最终的和res;
// 否则将下一层节点加入队列
if (cur == level) {
res += x.val;
} else {
if (x.left != null) {
queue.offer(x.left);
}
if (x.right != null) {
queue.offer(x.right);
}
}
}
cur++;
}
return res;
}
}
时空复杂度 O ( n ) O(n) O(n)。