题目:
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
例如输入下图中二叉树和整数22,则打印出两条路径,第一条路径包含结点10、12,第二条路径包含结点10、5和7。
思路:
1、判断根结点是否为空
2、单一路径要有vector<int> path保存;
3、多条路径要有vector<vector<int>> ret保存并返回;
4、从根结点分析,由于每次遍历都要先把结点的值进行访问所以是前序遍历;
5、在遍历的同时,需要保存访问过结点的值,并且和expectNumber相减得到剩余expectNumber
6、只有根结点才用判断最后的值和剩余expectnumber相等,不相等,pop出path
7、根结点相等即为递归退出条件
代码:
/* 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<vector<int>> ret; vector<int> path; if(root==NULL) { return ret; } findLeaf(ret,path,root,expectNumber); return ret; } void findLeaf(vector<vector<int>> &ret,vector<int> &path,TreeNode *node,int left) { path.push_back(node->val); //终止条件 if(left-node->val==0&&node->left==NULL&&node->right==NULL) { ret.push_back(path); } else { if(node->left) { int l=left-node->val; findLeaf(ret,path,node->left,l); } if(node->right) { int l=left-node->val; findLeaf(ret,path,node->right,l); } } //是叶子节点但是路径和不一样,pop这个叶子节点 path.pop_back(); } };
精简版代码:
/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ class Solution { vector<vector<int> >allRes; vector<int> tmp; void dfsFind(TreeNode * node , int left){ tmp.push_back(node->val); if(left-node->val == 0 && !node->left && !node->right) allRes.push_back(tmp); else { if(node->left) dfsFind(node->left, left-node->val); if(node->right) dfsFind(node->right, left-node->val); } tmp.pop_back(); } public: vector<vector<int> > FindPath(TreeNode* root,int expectNumber) { if(root) dfsFind(root, expectNumber); return allRes; } };
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。