c++实现---二叉树中和为某一值的路径

题目:输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
题目抽象:给定一颗二叉树,找出满足从根节点到叶子节点和为sun的所有路径。
思路:审清题意,问题是将根节点到叶子节点经过的结点形成一条路径。
1.先是根节点,再是左右子节点,因此考虑前序遍历;
2.考虑使用两个vector容器来保存路径,一个存放中间过程的每个值,另一个存放满足条件的路径;
3.再树结构中计算和为某个值:
方法一:新建一个辅助变量,不断叠加与目标值比较;
方法二:从目标值递减去当前节点的值,直到叶子节点为0.
代码

class Solution {
public:
    using vvi=vector<vector<int>>;
    using vi=vector<int>;
    void dfs(TreeNode *root,int num,vi &path,vvi &res){
        path.push_back(root->val);//将当前节点的值加入路径
        if(num==root->val&&!root->left&&!root->right){//base case:当当前节点的值和目标相等时,将前面的路径加入到总路径容器中
            res.push_back(path);
        }
        if(root->left) dfs(root->left,num-root->val, path,res);
        if(root->right) dfs(root->right,num-root->val, path,res);
        path.pop_back();//这一步表明当前路径走到该结点走不通,删除掉该结点,回溯回去继续遍历
    }
    vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
        vvi res;
        vi path;
        if(!root){
            return res;
        }
        dfs(root,expectNumber,path,res);
        return res;

    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值