【LeetCode - 666】路径和 IV

本文介绍了一种解决完全二叉树路径求和问题的方法。通过对节点进行特定的编号,利用深度优先搜索(DFS)策略,实现了从根节点到叶节点的所有路径求和,并返回这些路径的累加和。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值