剑指offer之面试题24:二叉树中和为某一值的路径
题目:
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
例如输入下图中二叉树和整数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、根结点相等即为递归退出条件
代码:
/*structTreeNode{intval;structTreeNode*left;structTreeNode*right;TreeNode(intx):val(x),left(NULL),right(NULL){}};*/classSolution{public:vector<vector<int>>FindPath(TreeNode*root,intexpectNumber){vector<vector<int>>ret;vector<int>path;if(root==NULL){returnret;}findLeaf(ret,path,root,expectNumber);returnret;}voidfindLeaf(vector<vector<int>>&ret,vector<int>&path,TreeNode*node,intleft){path.push_back(node->val);//终止条件if(left-node->val==0&&node->left==NULL&&node->right==NULL){ret.push_back(path);}else{if(node->left){intl=left-node->val;findLeaf(ret,path,node->left,l);}if(node->right){intl=left-node->val;findLeaf(ret,path,node->right,l);}}//是叶子节点但是路径和不一样,pop这个叶子节点path.pop_back();}};
精简版代码:
/*structTreeNode{intval;structTreeNode*left;structTreeNode*right;TreeNode(intx):val(x),left(NULL),right(NULL){}};*/classSolution{vector<vector<int>>allRes;vector<int>tmp;voiddfsFind(TreeNode*node,intleft){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,intexpectNumber){if(root)dfsFind(root,expectNumber);returnallRes;}};
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。