通知 网站从因情语写改为晴雨,这个网站的模板也从calmlog_ex改为 whimurmur

leetcode 剑指 Offer 34. 二叉树中和为某一值的路径

62人浏览 / 0人评论 / | 作者:whisper  | 分类: 剑指offer2  | 标签: 剑指offer2  | 

作者:whisper

链接:https://proprogrammar.com/article/922

声明:请尊重原作者的劳动,如需转载请注明出处


面试题34. 二叉树中和为某一值的路径

输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。

示例:

给定如下二叉树,以及目标和 target = 22

              5
             / \
            4   8
           /   / \
          11  13  4
         /  \    / \
        7    2  5   1

返回:

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

提示:

  1. 节点总数 <= 10000

难度:中等;标签:树,深度优先搜索;编程语言:C++


我的解法

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
private:
vector<vector<int>>res;
public:
    // c++改写
    vector<vector<int>> pathSum(TreeNode* root, int sum) {
        res.clear();
        vector<int> l;
        pathSum(root, &l, 0, sum);

        return res;
    }

    void pathSum(TreeNode* node, vector<int>* l, int val, int sum){
        if(node != NULL){
            l->push_back(node->val);
            if(val + node->val == sum){
                if(node->left == NULL && node->right == NULL){
                    vector<int> temp(l->begin(), l->end());
                    res.push_back(temp);
                }
            }
            
            pathSum(node->left, l, val + node->val, sum);
            pathSum(node->right, l, val + node->val, sum);

            l->erase(l->begin() + l->size() - 1, l->end());
        }
    }
};

深度优先搜索,注意到一定是到叶节点,而且如果没有到叶节点时出现和为sum,还是要向下深搜,因为下层的和可能为0,如sum=5,路径为2,3,1,-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 {
private:
    vector<int>path;
    vector<vector<int>>res;

public:
    vector<vector<int>> pathSum(TreeNode* root, int target) {
        // LinkedList<List<Interger>>=new LinkedList<>();
        dfs(root,target);
        return res;
    }
    void dfs(TreeNode* curr,int target)
    {
        if(curr)
        {
            // target-=target-curr->val;
            target-=curr->val;
            path.push_back(curr->val);
            if(target==0&&curr->left==nullptr&&curr->right==nullptr)
            {
                res.push_back(path);
            }
            else
            {
                dfs(curr->left,target);
                dfs(curr->right,target);
            }
            path.pop_back();
        }
    }
};

和我的解法差不多,不同的是我的解法dfs时没有else分支,这里有else分支,效率好一点,没有else也是可以的,代码看起来简洁一些,这算是一个小技巧,我的是结点值相加与sum比较,这里是sum减结点值与0比较,意思都差不多


亲爱的读者:有时间可以点赞评论一下

点赞(0) 打赏

全部评论

还没有评论!
广告位-帮帮忙点下广告