Leetcode 113. Path Sum II

本文介绍了一种算法,用于在二叉树中寻找所有从根节点到叶子节点的路径,其中路径上的节点值之和等于给定的目标值。通过递归深度优先搜索实现,并详细解释了代码逻辑。

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


                                                      

                                        Path Sum II



Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given sum.

For example:
Given the below binary tree and sum = 22,
              5
             / \
            4   8
           /   / \
          11  13  4
         /  \    / \
        7    2  5   1

return

[
   [5,4,11,2],
   [5,8,4,5]
]


第一次写有关二叉链表的深搜,心里有些小紧张.......

代码如下:

 是通过两个容器的过渡作用,将能求出目标和的路径保存在单个容器中再存在有嵌套的容器中 再返回嵌套容器

class Solution {
public:
    vector<vector<int>> pathSum(TreeNode* root, int sum) {
          vector<vector<int>>ress;  //用来存放路径
          vector<int>res;          //用来暂时存放路径
          dfs(root,sum,res,ress);  //搜索这棵树,将能达到sum的路径保存在嵌套容器中
          return ress;
    }
    void dfs(TreeNode* root, int sum,vector<int>&res,vector<vector<int>>&ress)
    {
        
        if(!root)                        //如果是空树就直接return即可,什么也不用做
          return;
        else if(sum==root->val&&!root->left&&!root->right)        //递归出口,如果是叶节点并且达到目标值的话,就把该节点放入一重容器,再将该一重容器放到嵌套容器中
        {
            res.push_back(root->val);
          ress.push_back(res);
            res.pop_back();                      //特别注意,一定要将该节点从一重容器中删除掉,因为如果不删除,回溯时实际上是要从容器中删除它的上一个节点的值
          return;                                        //但如果没删掉该节点,多余的该节点就会占用在容器中,使得删除的不是上一个节点而是该节点,这样会让下一次
        }                                                     //再找到一条合适的路径时,容器中多一个值,进而导致答案错误
         res.push_back(root->val);                  //不管怎样都先将该点的值放入容器
         dfs(root->left,sum-root->val,res,ress);     //递归搜索左子树
         dfs(root->right,sum-root->val,res,ress);   //递归搜索右子树
         res.pop_back();                             //如果该点的所有情况考虑完了,就将容器中的该点的值删除
    }
    
};








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值