【剑指 Offer】剑指 Offer 34. 二叉树中和为某一值的路径 (C++ dfs bfs 还原路径)

yiui 2022-02-02 19:46:25

剑指 Offer 34. 二叉树中和为某一值的路径 - 力扣(LeetCode) (leetcode-cn.com)

 

题意

找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。

思路1

dfs,枚举每一条从根节点到叶子节点的路径,当遍历到叶子节点时,如果此时的路径和为目标值,则计入答案。

时间复杂度O(n^2)

 

代码1

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<vector<int>>ans;
    vector<int>path;
    
    void dfs(TreeNode* root,int target){
        if(root==nullptr) return ;
        path.push_back(root->val);
        target=target-root->val;
        if(root->left==nullptr&&root->right==nullptr&&!target){
            //是叶子节点并且目标值为0,说明此时路径上的和恰好为要求的值
            ans.push_back(path);
        }
        dfs(root->left,target);
        dfs(root->right,target);
        path.pop_back();
    }

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

思路2

还可以用bfs去做,bfs的难点就在于如何恢复路径。

一般最短路中都是维护前驱数组pre来还原路径,这里用哈希维护前驱pre,用于还原路径。

每次遍历到叶子节点并且当前路径和等于目标值,就还原路径。

还原路径时,循环,如果当前节点不为空,则将当前节点计入答案,当前节点等于父节点。最后翻转一下。因为还原的时候最开始的节点是叶子节点。

bfs中维护结点跟路径和的队列就行~

时间复杂度也是O(n^2)

 

代码2

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<vector<int>>ans;
    map<TreeNode*,TreeNode*>pre;
    
    void getPath(TreeNode* root){
        vector<int>tt;
        while(root!=nullptr){
            tt.push_back(root->val);
            root=pre[root];
        }
        reverse(tt.begin(),tt.end());
        ans.push_back(tt);
    }

    vector<vector<int>> pathSum(TreeNode* root, int target) {
        if(root==nullptr) return ans;
        queue<TreeNode*>q;
        queue<int>sum;
        q.push(root);
        sum.push(0);
        while(!q.empty()){
            TreeNode* now=q.front();q.pop();
            int res=sum.front()+now->val;sum.pop();
            if(now->left==nullptr&&now->right==nullptr){
                if(res==target){
                    getPath(now);
                }
            }else{
                if(now->left!=nullptr){
                    pre[now->left]=now;
                    q.push(now->left);
                    sum.push(res);
                }
                if(now->right!=nullptr){
                    pre[now->right]=now;
                    q.push(now->right);
                    sum.push(res);
                }
            }
            
        }
        return ans;
    }
};

 

...全文
109 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
CSDN-Ada助手 2023-01-13
  • 打赏
  • 举报
回复
您可以前往 CSDN问答-数据结构与算法 发布问题, 以便更快地解决您的疑问

67,633

社区成员

发帖
与我相关
我的任务
社区描述
欢迎大家来到抱团内卷学习社区,在这里大家可以分享自己的学习笔记,求职心得,一起记录彼此的成长历程。社区群号:94108843,WX公众号:【兴趣使然的草帽路飞】
社区管理员
  • 路  飞
  • 一百个Chocolate
  • 灰小猿
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

最怕你一生碌碌无为,还安慰自己平凡可贵!

努力提高自己的知识储备,助力每一位冲刺大厂的小伙伴!

祝大家前程似锦,offer连连!

注意:每个月活跃积分最高的小伙伴,可以获得社区管理员权限哦!

试试用AI创作助手写篇文章吧