鱼C论坛

 找回密码
 立即注册
查看: 879|回复: 3

[技术交流] C++刷剑指offer(面试题34. 二叉树中和为某一值的路径)【回溯】

[复制链接]
发表于 2020-4-4 12:37:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 糖逗 于 2020-5-8 17:28 编辑

题目描述:
  1. 输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。

  2.  

  3. 示例:
  4. 给定如下二叉树,以及目标和 sum = 22,

  5.               5
  6.              / \
  7.             4   8
  8.            /   / \
  9.           11  13  4
  10.          /  \    / \
  11.         7    2  5   1
  12. 返回:

  13. [
  14.    [5,4,11,2],
  15.    [5,8,4,5]
  16. ]
  17.  

  18. 提示:

  19. 节点总数 <= 10000

  20. 来源:力扣(LeetCode)
  21. 链接:https://leetcode-cn.com/problems/er-cha-shu-zhong-he-wei-mou-yi-zhi-de-lu-jing-lcof
  22. 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
复制代码



  1. #include<iostream>
  2. #include <malloc.h>
  3. #include <vector>
  4. #include <math.h>
  5. #include <queue>
  6. #include<vector>
  7. using namespace std;

  8. struct TreeNode{
  9.         int val;
  10.         TreeNode* left;
  11.         TreeNode* right;
  12.         TreeNode(int x): val(x), left(NULL), right(NULL){
  13.         }
  14. };

  15. TreeNode* CreateTree(vector<int> input){
  16.         TreeNode* res = (TreeNode*)malloc(sizeof(TreeNode)*input.size());
  17.         for(int i = 0; i < input.size(); i++){
  18.                 res[i].val = input[i];
  19.                 res[i].left = NULL;
  20.                 res[i].right = NULL;
  21.         }
  22.         for(int i= 0; i < input.size(); i++){
  23.                 if(2*i+1 < input.size()){
  24.                         res[i].left = &res[2*i+1];
  25.                 }
  26.                 if(2*i+2 < input.size()){
  27.                         res[i].right = &res[2*i+2];
  28.                 }
  29.                
  30.         }
  31.         return res;
  32.         
  33. }

  34. void middle(TreeNode* root, vector<vector<int> >& res, int left, int right, int depth){
  35.     if(root == NULL) return;
  36.     int insert = left + (right - left) / 2;
  37.     res[depth][insert] = root->val;
  38.            
  39.     middle(root->left, res, left, insert - 1, depth + 1);
  40.     middle(root->right, res, insert + 1, right, depth + 1);
  41.     }

  42. int treeDepth(TreeNode* root){
  43.     if(root == NULL || root -> val == 0) return 0;
  44.     return max(treeDepth(root->left) + 1, treeDepth(root->right) + 1);
  45. }
  46.       
  47. void PrintTree(TreeNode* root) {
  48.     int depth = treeDepth(root);
  49.     int width = pow(2, depth) - 1;
  50.     vector<vector<int> > res(depth, vector<int>(width, 0));
  51.     middle(root, res, 0, width - 1, 0);
  52.     for(int i = 0; i < res.size(); i++){
  53.                 for(int j = 0; j < res[i].size();j++){
  54.                         if(res[i][j] == 0){
  55.                                 cout  << " ";
  56.                         }
  57.                         else{
  58.                                 cout << res[i][j];
  59.                         }
  60.                        
  61.                 }
  62.                 cout << endl;
  63.         }
  64.         cout << "------------------" << endl;
  65.     }



  66. void dfs(TreeNode* root, vector<vector<int> >& res, int sum, vector<int>& temp){
  67.         temp.push_back(root -> val);
  68.         if(sum == root -> val && !root->right && !root -> left){
  69.                 res.push_back(temp);
  70.         }
  71.         if(root -> right) dfs(root -> right, res, sum - root->val, temp);
  72.         if(root -> left) dfs(root -> left, res, sum - root->val, temp);
  73.         temp.pop_back();
  74. }


  75. vector<vector<int> > solution(TreeNode* root, int sum){
  76.         vector<vector<int> > res;
  77.         vector<int> temp;
  78.         if(root == NULL) return res;
  79.         dfs(root, res, sum, temp);
  80.         return res;
  81. }



  82. int main(void){
  83.         vector<int> input1;
  84.         cout << "send numbers for the first tree" << endl;
  85.         int number1;
  86.         while(cin >> number1){
  87.                 input1.push_back(number1);
  88.         }
  89.         cin.clear();
  90.         TreeNode* root = CreateTree(input1);
  91.         PrintTree(root);
  92.         
  93.         
  94.         int sum;
  95.         cin >> sum;
  96.         vector<vector<int> > res = solution(root, sum);
  97.         for(int i = 0; i < res.size(); i++){
  98.                 for(int j = 0; j < res[0].size(); j++){
  99.                         cout << res[i][j] << " ";
  100.                         }
  101.                         cout << endl;
  102.                 }
  103.         
  104.         return 0;
  105. }
复制代码




注意事项:
1.回溯法
2.本地调试后未输出多个方案,但leetcode上通过了。

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-4-4 12:38:40 | 显示全部楼层
新增代码:
  1. void dfs(TreeNode* root, vector<vector<int> >& res, int sum, vector<int>& temp){
  2.         temp.push_back(root -> val);
  3.         if(sum == root -> val && !root->right && !root -> left){
  4.                 res.push_back(temp);
  5.         }
  6.         if(root -> right) dfs(root -> right, res, sum - root->val, temp);
  7.         if(root -> left) dfs(root -> left, res, sum - root->val, temp);
  8.         temp.pop_back();
  9. }


  10. vector<vector<int> > solution(TreeNode* root, int sum){
  11.         vector<vector<int> > res;
  12.         vector<int> temp;
  13.         if(root == NULL) return res;
  14.         dfs(root, res, sum, temp);
  15.         return res;
  16. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-7 15:49:20 | 显示全部楼层
112. 路径总和
相似题目:
  1. 给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。

  2. 说明:&#160;叶子节点是指没有子节点的节点。

  3. 示例:&#160;
  4. 给定如下二叉树,以及目标和 sum = 22,

  5.               5
  6.              / \
  7.             4   8
  8.            /   / \
  9.           11  13  4
  10.          /  \      \
  11.         7    2      1
  12. 返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2。

  13. 来源:力扣(LeetCode)
  14. 链接:https://leetcode-cn.com/problems/path-sum
  15. 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
复制代码


核心新增代码:
  1. bool solution(TreeNode* root, int target){
  2.         if(root == NULL) return false;
  3.         if(target == root -> val && root -> right == NULL && root -> left == NULL) return true;
  4.         return solution(root -> left, target - root -> val) || solution(root -> right, target - root -> val);

  5. }

  6. int main(void){
  7.         cout << "please send the number for the tree" << endl;
  8.         vector<int> input;
  9.         int number;
  10.         while(cin >> number){
  11.                 input.push_back(number);
  12.         }
  13.         TreeNode* root = Create
  14.         Tree(input);
  15.         PrintTree(root);
  16.         cin.clear();
  17.         int target;
  18.         cin >> target;
  19.        
  20.         bool res = solution(root, target);
  21.         cout << res << endl;
  22.        
  23.         return 0;
  24. }
复制代码



注意要点:
1.使用了深度优先搜索。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-8 14:13:19 | 显示全部楼层
相似题目:129. 求根到叶子节点数字之和
  1. 给定一个二叉树,它的每个结点都存放一个&#160;0-9&#160;的数字,每条从根到叶子节点的路径都代表一个数字。

  2. 例如,从根到叶子节点路径 1->2->3 代表数字 123。

  3. 计算从根到叶子节点生成的所有数字之和。

  4. 说明:&#160;叶子节点是指没有子节点的节点。

  5. 示例 1:

  6. 输入: [1,2,3]
  7.     1
  8.    / \
  9.   2   3
  10. 输出: 25
  11. 解释:
  12. 从根到叶子节点路径 1->2 代表数字 12.
  13. 从根到叶子节点路径 1->3 代表数字 13.
  14. 因此,数字总和 = 12 + 13 = 25.
  15. 示例 2:

  16. 输入: [4,9,0,5,1]
  17.     4
  18.    / \
  19.   9   0
  20. &#160;/ \
  21. 5   1
  22. 输出: 1026
  23. 解释:
  24. 从根到叶子节点路径 4->9->5 代表数字 495.
  25. 从根到叶子节点路径 4->9->1 代表数字 491.
  26. 从根到叶子节点路径 4->0 代表数字 40.
  27. 因此,数字总和 = 495 + 491 + 40 = 1026.

  28. 来源:力扣(LeetCode)
  29. 链接:https://leetcode-cn.com/problems/sum-root-to-leaf-numbers
  30. 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
复制代码


  1. #include<iostream>
  2. #include <malloc.h>
  3. #include <vector>
  4. #include <math.h>
  5. #include <queue>
  6. #include<vector>
  7. using namespace std;

  8. struct TreeNode{
  9.         int val;
  10.         TreeNode* left;
  11.         TreeNode* right;
  12.         TreeNode(int x): val(x), left(NULL), right(NULL){
  13.         }
  14. };

  15. TreeNode* CreateTree(vector<int> input){
  16.     TreeNode* res = (TreeNode*)malloc(sizeof(TreeNode)*input.size());
  17.     for(int i = 0; i < input.size(); i++){
  18.             res[i].val = input[i];
  19.             res[i].left = NULL;
  20.             res[i].right = NULL;
  21.     }
  22.     for(int i= 0; i < input.size(); i++){
  23.             if(2*i+1 < input.size()){
  24.                     res[i].left = &res[2*i+1];
  25.             }
  26.             if(2*i+2 < input.size()){
  27.                     res[i].right = &res[2*i+2];
  28.             }
  29.            
  30.     }
  31.     return res;
  32.         
  33. }

  34. void middle(TreeNode* root, vector<vector<int> >& res, int left, int right, int depth){
  35.     if(root == NULL) return;
  36.     int insert = left + (right - left) / 2;
  37.     res[depth][insert] = root->val;
  38.            
  39.     middle(root->left, res, left, insert - 1, depth + 1);
  40.     middle(root->right, res, insert + 1, right, depth + 1);
  41.     }

  42. int treeDepth(TreeNode* root){
  43.     if(root == NULL || root -> val == 0) return 0;
  44.     return max(treeDepth(root->left) + 1, treeDepth(root->right) + 1);
  45. }
  46.       
  47. void PrintTree(TreeNode* root) {
  48.     int depth = treeDepth(root);
  49.     int width = pow(2, depth) - 1;
  50.     vector<vector<int> > res(depth, vector<int>(width, 0));
  51.     middle(root, res, 0, width - 1, 0);
  52.     for(int i = 0; i < res.size(); i++){
  53.         for(int j = 0; j < res[i].size();j++){
  54.                 if(res[i][j] == 0){
  55.                         cout  << " ";
  56.                 }
  57.                 else{
  58.                         cout << res[i][j];
  59.                 }
  60.                
  61.         }
  62.         cout << endl;
  63.     }
  64.     cout << "------------------" << endl;
  65. }

  66. void dfs(TreeNode* root, vector<int>& store, string& temp){
  67.     temp += to_string(root -> val);
  68.         if(root -> right == NULL && root -> left == NULL) store.push_back(atoi(temp.c_str()));
  69.        
  70.         if(root -> right != NULL)dfs(root -> right, store, temp);
  71.         if(root -> left != NULL)dfs(root -> left, store, temp);
  72.         temp.erase(temp.size()-1);

  73. }


  74. int solution(TreeNode* root){
  75.         if(root == NULL) return 0;
  76.     vector<int> store;
  77.     string temp;
  78.         dfs(root, store, temp);
  79.         int res = 0;
  80.         for(int i = 0; i< store.size(); i++){
  81.                 res += store[i];
  82.         }
  83.         return res;
  84. }

  85. int main(void){
  86.         vector<int> input1;
  87.     cout << "send numbers for the  tree" << endl;
  88.     int number1;
  89.     while(cin >> number1){
  90.             input1.push_back(number1);
  91.     }
  92.     cin.clear();
  93.     TreeNode* root = CreateTree(input1);
  94.     PrintTree(root);
  95.    
  96.    
  97.     int res = solution(root);
  98.     cout << res << endl;
  99.     return 0;
  100. }

复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-11 13:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表