【剑指offer】15.二叉树中和为某一值的路径(二)
总目录:
1.问题描述
输入一颗二叉树的根节点root和一个整数expectNumber,找出二叉树中结点值的和为expectNumber的所有路径。
1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点
2.叶子节点是指没有子节点的节点
3.路径只能从父节点到子节点,不能从子节点到父节点
4.总节点数目为n
如二叉树root为{10,5,12,4,7},expectNumber为22
则合法路径有[[10,5,7],[10,12]]
数据范围:
树中节点总数在范围 [0, 5000] 内
-1000 <= 节点值 <= 1000
-1000 <= expectNumber <= 1000
2.问题分析
1深度搜索,递归
2广度搜索,借助队列。但数据结构较为复杂,暂未看懂。
3.代码实例
深度搜索,递归
1 class Solution { 2 public: 3 vector<vector<int>> ret; 4 vector<int> path; 5 void dfs(TreeNode* root, int number) { 6 // 处理树为空 7 if (root == NULL) return; 8 // 路径更新 9 path.emplace_back(root->val); 10 // number更新 11 number -= root->val;//剩余需要的数字 12 // 如果递归当前节点为叶子节点且该条路径的值已经达到了expectNumber,则更新ret 13 if(root->left == NULL && root->right == NULL && number == 0) { 14 ret.emplace_back(path); 15 } 16 // 左右子树递归 17 dfs(root->left, number); 18 dfs(root->right, number); 19 path.pop_back(); 20 } 21 22 vector<vector<int>> FindPath(TreeNode* root,int expectNumber) { 23 dfs(root, expectNumber); 24 return ret; 25 } 26 };
广度搜索
1 #include<numeric> 2 class Solution { 3 public: 4 vector<vector<int>> FindPath(TreeNode* root,int expectNumber) { 5 vector<vector<int>> ret; 6 if(root == NULL) return ret; 7 pair<vector<int>, TreeNode*> p({root->val}, root); 8 // 维护一个path,node的队列 9 queue< pair<vector<int>, TreeNode*> > q; 10 q.push(p); 11 // 如果队列非空 12 while(!q.empty()) { 13 pair<vector<int>, TreeNode*> cur = q.front(); 14 q.pop(); 15 TreeNode* node = cur.second; 16 // 左子节点path 17 if(node->left) { 18 vector<int> left = cur.first; 19 left.push_back(node->left->val); 20 q.push(make_pair(left, node->left)); 21 } 22 // 右子节点path 23 if(node->right) { 24 vector<int> right = cur.first; 25 right.push_back(node->right->val); 26 q.push(make_pair(right, node->right)); 27 } 28 // 叶子节点统计 29 if(node->left == NULL && node->right == NULL) { 30 vector<int> l = cur.first; 31 int sum = accumulate(l.begin(), l.end(), 0); 32 if(sum == expectNumber) ret.push_back(l); 33 } 34 } 35 return ret; 36 } 37 };