代码

要求:

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

程序:

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};*/
class Solution {
public:
    vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
        vector<int> path;
        vector<vector<int>> result;
        if(root){
            findPathRes(root,expectNumber,path,result);
        }
        return result;
    }
private:
    void findPathRes(TreeNode* node, int leftNumber, vector<int> &path, vector<vector<int>> &result){ //关键点1
        path.push_back(node->val);
        if(leftNumber-node->val==0&&!node->left&&!node->right){
            result.push_back(path);
        }else{
            if(node->left){
                findPathRes(node->left, leftNumber-node->val,path,result);
            }
            if(node->right){
                findPathRes(node->right, leftNumber-node->val,path,result);
            }
        }
        path.pop_back(); //关键点2
    }
    
};

注意:

1.关键点1:用目标值依次减去路径上的每一个节点值,用这种方式来判断路径上每一个节点值之和是否等于目标值。(之前的想法是,计算路径上每一个节点的值之和,然后判断是否等于目标值)

2.关键点2:对于每一个节点,第一步都需要放进数组里,然后判断是否满足如下条件

如果目标值恰好为0,且到达叶子节点,则输出路径

否则,要么递归(非叶子节点),要么啥也不干(到达叶子节点,但目标值未减为0)

最后一步,就是吐出当前节点,目的是为了遍历下一条路径(不经过当前节点)


jack2wang
753 声望27 粉丝