LeetCode 113. 路径总和 II(C++)

题目描述

给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。

说明: 叶子节点是指没有子节点的节点。

示例:
给定如下二叉树,以及目标和 sum = 22

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

返回:

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

解题思路:

1.从根节点深度遍历二叉树,先序遍历是,将该节点值存储在栈中,使用变量累计结点值。

2.当遍历至叶节点时,检查val是否等于sum,若为则将这条路径存入结果集中。

3.在后续的遍历时,将该节点的值从栈中弹出,value减去结点值。

代码分析:

/**
 * 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 {
public:
    void   pathsumSum(TreeNode * root,int sum,vector>& result,int& value ,vector&  temp){
        if (root==NULL){     
            return ;
        }
        temp.push_back(root->val);//遍历一个节点
        value+=root->val;         //更新一次路径值
        if (!root->left&&!root->right){  //当刚刚遍历的结点是叶子节点时,判断是否满足sum的条件,条件满足时。可以加入结果集。
            if(sum==value){
                result.push_back(temp);
            }
        }
        pathsumSum(root->left,sum,result,value ,temp);
        pathsumSum(root->right,sum,result,value ,temp);
        value-=root->val;         //遍历完成后,更改路径值
        temp.pop_back();          //将此节点冲路径栈中弹出
        }
    vector> pathSum(TreeNode* root, int sum) {
        vector>  result;//存储所有结果路径
        vector  temp;          //存储正在遍历的路径
        int value=0;                 //正在遍历的路径上数据之和
        pathsumSum( root, sum,result,value ,temp);
        return result;
    }
};

运行结果:

LeetCode 113. 路径总和 II(C++)_第1张图片

你可能感兴趣的:(LeetCode刷题之二叉树)