剑指offer:打印二叉树中和为K的所有路径: 二叉树中和为某一值的路径

题目:

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

题目解析已经写到代码中啦!

/*
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};*/
// 要求返回所有路径,路径是指从根节点到叶子节点。
// 从根节点开始遍历,如果根节点为空则返回空,
// 若加上当前节点的值已经等于期望节点并且该节点为叶子节点,则需要将该路径加入总路径统计中
// 否则,遍历左子树,左子树遍历完紧接着遍历右子树。可以从根节点开始遍历,,
// 当改节点的左右子树都已经遍历完说明含有该节点的所有可能路径都已经遍历完
class Solution {
public:
    // 加上当前节点的值,判断当前和是否等于期望值。如果相等且当前节点为叶子节点则将路径加入到总路径统计中
    // 如果不是叶子节点则遍历左右子树,左右子树都遍历完则说明以该节点为路径节点的都已经遍历完,返回到上一个节点。
    void FindPath(TreeNode* root,
                  vector<vector<int>> &paths,
                  vector<int>&path,
                  int currentSum,
                  int expectNumber) {
       currentSum +=root->val; //加上当前值
       path.push_back(root->val); //将当前节点压入路径
       bool isLeaf = (root->left== nullptr && root->right == nullptr);
       if(currentSum == expectNumber && isLeaf){ //是叶子节点并且和期望值相等,则加入到总路径
           paths.push_back(path);
       }
       if(root->left !=nullptr)
           FindPath(root->left, paths,path, currentSum, expectNumber);
       if(root->right!=nullptr)
           FindPath(root->right, paths, path, currentSum, expectNumber);
        path.pop_back();
    }
    vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
          vector<vector<int>> paths;
          if(root == nullptr) return paths; //为空直接返回paths
          vector<int>path; //定义一个路径,currentSum - 0;
          FindPath(root, paths,path, 0, expectNumber);
          return paths;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章