题目描述
输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
提交链接:点击
思路:读题,发现要求的是从根节点到叶子节点的路径结点和是否等于某一给定的整数。由此,我们很容易想到DFS深度优先搜索,沿着子树一直搜到底(这里就有递归调用DFS的过程),如果发现和等于给定整数,那么将该路径放入最后结果中,如果不等于,那么就要进行退栈的操作,也就是走其他的路径,看看是否满足条件。
代码:
/* 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>> result; vector<int> elem; void dfs(TreeNode* root, int expectNumber){ elem.push_back(root->val); if(root->val==expectNumber && root->left==NULL && root->right==NULL){//到达了叶子节点且从根节点到叶子节点的和等于整数 result.push_back(elem); }else{ //否则如果不是叶子节点,继续dfs if(root->left) dfs(root->left, expectNumber-root->val); if(root->right) dfs(root->right, expectNumber-root->val); }//如果是叶子节点,但是从根节点到叶子节点的和不等于expectNumber,则元素退栈,进行另一路径的判断 elem.pop_back(); } vector<vector<int> > FindPath(TreeNode* root,int expectNumber) { if(root) dfs(root, expectNumber); return result; } };