1、题目描述
2、解题思路
如果题目给定的是二叉树的根节点,那么直接 dfs 即可。
现在题目给的是用整数来表示的节点。
画出深度为 4 的完全二叉树:
其中,数字表示该节点在当前所在层的位置。
通过观察可知,对于某一个节点来说,如果它的位置编号为 i,那么,它的左子节点的位置编号为 i × 2 - 1,它的右子节点的位置编号为左子节点位置编号加一。
于是,算法流程为:
1、先把给定的节点用 Map 记录起来,key 为整数的前两位,value 为整数的后一位,即 key 为位置信息,value 为权值。map.put(num / 10, num % 10);
2、定义一个全局遍历 ans 表示所有的路径和,定义一个局部变量 sum 表示一条路径上的权值和。
3、从根节点开始 dfs:
3.1 取出当前节点 node 的权值加入到 sum 中:sum += map.get(node);
3.2 取出当前节点 node 的位置信息:depth = node / 10; pos = node % 10;
3.3 计算出左右子树的位置信息:left = (depth + 1) * 10 + pos * 2 - 1;right = left + 1;
3.4 如果 left 和 right 均不在 map 中,说明一条路径计算完毕,ans += sum;否则,继续向下 dfs。
3、解题代码
class Solution {
private int ans = 0;
private Map<Integer, Integer> map;
public int pathSum(int[] nums) {
// key 为深度和位置, value 为权值
map = new HashMap<>();
for (int num : nums) {
map.put(num / 10, num % 10);
}
dfs(nums[0] / 10, 0);
return ans;
}
/**
* @param node
* @param sum 包括 num 之前的总和
*/
private void dfs(int node, int sum) {
if (!map.containsKey(node)) {
return;
}
sum += map.get(node);
int depth = node / 10;
int pos = node % 10;
int left = (depth + 1) * 10 + pos * 2 - 1;
int right = left + 1;
if (!map.containsKey(left) && !map.containsKey(right)) {
// 当前节点是叶子节点
ans += sum;
} else {
dfs(left, sum);
dfs(right, sum);
}
}
}