【LeetCode - 666】路径和 IV

文章目录

  • 1、题目描述
  • 2、解题思路
  • 3、解题代码

1、题目描述

【LeetCode - 666】路径和 IV_第1张图片

2、解题思路

  如果题目给定的是二叉树的根节点,那么直接 dfs 即可。

  现在题目给的是用整数来表示的节点。

  画出深度为 4 的完全二叉树:
【LeetCode - 666】路径和 IV_第2张图片

  其中,数字表示该节点在当前所在层的位置。

  通过观察可知,对于某一个节点来说,如果它的位置编号为 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);
        }
    }
}

你可能感兴趣的:(LeetCode刷题记录,leetcode,java)