二叉树根节点到叶子结点和为指定值的路径

题目描述

image.png

题解

解题思路与二叉树根节点到叶节点的所有路径和一题相似,都是采用递归算法。但这个题加了一点,要求保存路径到vector中。
为了保存路径,这里给递归函数传递一个vector类型的参数,用于保存从根节点到当前节点的路径。将当前节点值追加到vector末尾,再向下层传递。当到达叶节点时,判断是否符合条件,如果符合,就将该路径加到结果中。
到叶节点就可以完成判断并得到路径了,所以递归函数不需要返回值。

代码

// pathSum.cpp
#include <iostream>
#include <vector>

using namespace std;

struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int val){
        this->val = val;
        this->left = NULL;
        this->right = NULL;
    }
};

class Solution {
public:
    /**
     *
     * @param root TreeNode类
     * @param sum int整型
     * @return int整型vector<vector<>>
     */
    vector<vector<int> > pathSum(TreeNode* root, int sum) {
        // write code here
        if (root == NULL){
            return meet;
        }
        vector<int> path;
        targetSum = sum;
        sumNumbers(root, root->val, path);
        return meet;
    }
private:
    vector<vector<int>> meet;
    int targetSum;
    void sumNumbers(TreeNode* t, int sum, vector<int> path){
        path.push_back(t->val);
        if (t->left == NULL && t->right == NULL){
            if (sum == targetSum){
                meet.push_back(path);
            }
        }
        if (t->left != NULL){
            sumNumbers(t->left, t->left->val + sum, path);
        }
        if (t->right != NULL){
            sumNumbers(t->right, t->right->val + sum, path);
        }
    }
};
int main()
{
    TreeNode* root = new TreeNode(5);
    TreeNode* left = new TreeNode(4);
    TreeNode* right = new TreeNode(8);
    TreeNode* leftleft = new TreeNode(1);
    TreeNode* leftright = new TreeNode(11);
    TreeNode* leftrightleft = new TreeNode(2);
    TreeNode* leftrightright = new TreeNode(7);
    TreeNode* rightright = new TreeNode(9);
    root->left = left;
    root->right = right;
    left->left = leftleft;
    left->right = leftright;
    leftright->left = leftrightleft;
    leftright->right = leftrightright;
    right->right = rightright;

    Solution s;
    vector<vector<int>> meet = s.pathSum(root, 22);
    for (int i = 0; i < meet.size(); i++){
        for (int j = 0; j < meet[i].size(); j++){

            cout << meet[i][j] << " ";
        }
        cout << endl;
    }
    delete root;
    delete left;
    delete right;
    delete leftleft;
    delete leftright;
    delete leftrightleft;
    delete leftrightright;
    delete rightright;
    return 0;

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容