时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
题目描述
输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
思路:
根据题意,可以想到通过使用深度优先遍历对节点值进行相加与所输入的整数进行对比,相等则存入vector容器中。
1、深度优先遍历将节点加入path中(通过vector<int>类型的path用于保存所经过的节点)
2、若该结点是叶子结点则比较当前路径和是否等于期待和,等于,则将path路径加入到vector<vector<int>>容器中。
3、弹出结点,每一轮递归返回到父结点时,当前路径也应该回退一个结点(重要)
/* 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>> res; vector<int> path; vector<vector<int> > FindPath(TreeNode* root,int expectNumber) { find(root,expectNumber); return res; } void find(TreeNode* root,int sum) { if(root == NULL) return ; path.push_back(root->val); if(!root->left && !root->right && sum == root->val) res.push_back(path); else { if(root->left) find(root->left,sum-root->val); if(root->right) find(root->right,sum- root->val); } path.pop_back(); } };
这里复习下,深度和广度优先遍历:
深度优先遍历:先访问根节点,再访问左子树最后再访问右子树。利用堆栈的先进后出的特性先将右子树压栈,再将左子树压栈,这样就保证左子树位于栈顶,先被访问。
广度优先遍历(或者叫层次遍历):从根节点开始沿着树的宽度进行遍历,也就是一层一层的访问二叉树的节点,利用队列先进先出的特性来做。