[Tree Depth First Search] 路径总和 II

本文解析了LeetCode上编号为113的题目PathSum II,难度等级为中等。该题要求在给定的二叉树中寻找所有从根节点到叶子节点的路径,这些路径的总和等于给定的目标和。文章详细介绍了使用回溯算法解决此问题的方法,通过示例清晰展示了算法的执行流程。

leetcode 113、Path Sum II,难度medium

0. 题干

给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。

说明: 叶子节点是指没有子节点的节点。

示例:
给定如下二叉树,以及目标和 sum = 22,

在这里插入图片描述

1. 代码

class Solution {
private:
    vector<vector<int>> ans;
    vector<int> t;
public:
    void findPath(TreeNode* root,int sum){
        if(!root) return;
        t.push_back(root->val);
        if(!root->left && !root->right && root->val==sum) ans.push_back(t);
        findPath(root->left,sum-root->val);
        findPath(root->right,sum-root->val);
        t.pop_back();
//pop_back删除向量容器最后一个成员
    }

    vector<vector<int>> pathSum(TreeNode* root, int sum) {
        findPath(root,sum);
        return ans;
    }
};

2 代码流程

这个代码流程详细说下,用了之前没整过的思想,叫做回溯算法。

2.1 啥叫回溯算法?

我们可以理解为通过选择不同的岔路口寻找目的地,一个个岔路口一个岔路口的去尝试找到目的地。
如果走错了路,继续返回来找到岔路口的另一条路,直到找到目的地。
(描述参考):https://www.jianshu.com/p/dd3c3f3e84c0

2.2 举例说明

在这里插入图片描述

就以题干的树为例子,目标和sum为22,这颗树共四层;以下为了描述方便,直接把结点值描述为结点的名称。

先存root结点5,到一维指针数组t里面,sum值减5,进入结点4,sum值再减去4,进入结点11,sum值再减去11,
结点11,然后进入 结点11的左节点7,此时sum值22-5-4-11=2不 为7,由于结点7的左右孩子都为NULL,此时递归return,

返回到第四层,继续返回到第三层,并且把7从一维数组里面删除掉(回溯);进入结点11的右孩子2,满足要求,于是把存储了
[5,4,11,2]的数组存到ans里面;

接下来不断递归return,t只剩下值5;sum值减5进去结点8,再减8进去左孩子结点13,此时22-5-8=9,不符合要求;

清除数组t里面的值13,递归回到结点8,然后进入结点4,sum继续减4;sum=22-5-8-4=5,

发现[5,8,4,5]符合要求,于是存到 ans数组里面; 回溯删除5,回到结点4.发现右孩子1不满足要求;

最终满足要求的是[5,4,11,2]和[5,8,4,5],已被依次存到ans里面,问题OVER!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值