• 在二叉树中找出和为某一值的所有路径


    题目:

    请写一个程序创建一棵二叉树,并按照一定规则,输出二叉树根节点到叶子节点的路径。

    规则如下:
    1、从最顶端的根结点,到最下面的叶子节点,计算路径通过的所有节点的和,如果与设置的某一值的相同,那么输出这条路径上的所有节点。

    2、从根节点遍历树时,请请按照左到右遍历,即优先访问左子树的节点。


    二叉树创建规则:从上到下一层一层的,按照从左到右的顺序进行构造

    输入"10,5,12,4,7"值,构造的树如下:

    1)    10


    2)    10
           /
          5
          
    3)    10
           /
          5  12
     
    4)    10
           /
          5  12 
         /
        4     
          
    5)    10
           /
          5  12 
         /
        4  7

    针对上面的二叉树,如果当前我们设置的“路径和”为19,那么输出结果为:

    10,5,4

    如果有多个路径,按到左到右的顺序遍历生成的结果每行显示一个显示。例如如果当前我们设置的“路径和”为22,那么输出结果为:

    10,5,7

    10,12

    如果没有找到路径和为设置的值的路径,输出error。

    运行时间限制: 无限制
    内存限制: 无限制
    输入:

    输入整数N---路径和

    一行字符串,多个正整数,之间用","隔开

    输出:

    满足条件的二叉树路径

    样例输入:
    22
    10,5,12,4,7
    样例输出:
    10,5,7
    10,12

    代码:

     1 #include <iostream>
     2 #include <sstream>
     3 #include <vector>
     4 #include <stdlib.h>
     5 
     6 using namespace std;
     7 
     8 struct TreeNode
     9 {
    10     int val;
    11     TreeNode *left, *right;
    12     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    13 };
    14 
    15 void creatTree(TreeNode *&root, vector<int>& a, int i, int len)
    16 {
    17     if (i >= len)
    18         return;
    19     root = new TreeNode(a[i]);
    20     creatTree(root->left, a, 2 * i + 1, len);
    21     creatTree(root->right,a, 2 * i + 2, len);
    22 }
    23 
    24 void inorderTraversal(TreeNode* root)
    25 {
    26     if (root)
    27     {
    28         cout << root->val << " ";
    29         inorderTraversal(root->left);
    30         inorderTraversal(root->right);
    31     }
    32 }
    33 
    34 vector<int> vec;
    35 int sum = 0;
    36 bool isCoutBlank = false;
    37 bool isFind = false;
    38 void pathTree(TreeNode*& root, int target)
    39 {
    40     sum += root->val;
    41     vec.push_back(root->val);
    42     if (sum == target && !root->left && !root->right)
    43     {
    44         isFind = true;
    45         if(isCoutBlank)
    46             cout << endl;
    47         isCoutBlank = true;
    48         for (int i = 0; i < vec.size() - 1; ++i)
    49         {
    50             cout << vec[i]<< ",";
    51         }
    52         cout << vec[vec.size() - 1];
    53     }
    54     if (root->left)
    55         pathTree(root->left, target);
    56     if (root->right)
    57         pathTree(root->right, target);
    58     sum -= root->val;
    59     vec.pop_back();
    60 }
    61 
    62 
    63 int main()
    64 {
    65     TreeNode* root = nullptr;
    66     int target;
    67     cin >> target;
    68     string val;
    69     cin >> val;
    70     string temp;
    71     stringstream ss(val);
    72     int node;
    73     vector<int> nodes;
    74     while (!ss.eof())
    75     {
    76         getline(ss, temp, ',');
    77         stringstream stmp;
    78         stmp << temp;
    79         stmp >> node;
    80         nodes.push_back(node);
    81     }
    82     creatTree(root, nodes, 0, nodes.size());
    83     pathTree(root,target);
    84     if (!isFind)
    85         cout << "error";
    86 }

    另一种方法:用多个临时vector存储路径值,不用做pop_back操作

      1 #include <iostream>
      2 #include <sstream>
      3 #include <vector>
      4 #include <numeric>
      5 
      6 using namespace std;
      7 
      8 struct TreeNode
      9 {
     10     int val;
     11     TreeNode *left, *right;
     12     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
     13 };
     14 
     15 void creatTree(TreeNode *&root, vector<int>& a, int i, int len)
     16 {
     17     if (i >= len)
     18         return;
     19     root = new TreeNode(a[i]);
     20     creatTree(root->left, a, 2 * i + 1, len);
     21     creatTree(root->right,a, 2 * i + 2, len);
     22 }
     23 
     24 void inorderTraversal(TreeNode* root)
     25 {
     26     if (root)
     27     {
     28         cout << root->val << " ";
     29         inorderTraversal(root->left);
     30         inorderTraversal(root->right);
     31     }
     32 }
     33 
     34 vector<int> vec;
     35 int sum = 0;
     36 bool isCoutBlank = false;
     37 bool isFind = false;
     38 void pathTree(TreeNode*& root, int target)
     39 {
     40     sum += root->val;
     41     vec.push_back(root->val);
     42     if (sum == target && !root->left && !root->right)
     43     {
     44         isFind = true;
     45         if(isCoutBlank)
     46             cout << endl;
     47         isCoutBlank = true;
     48         for (int i = 0; i < vec.size() - 1; ++i)
     49         {
     50             cout << vec[i]<< ",";
     51         }
     52         cout << vec[vec.size() - 1];
     53     }
     54     if (root->left)
     55         pathTree(root->left, target);
     56     if (root->right)
     57         pathTree(root->right, target);
     58     sum -= root->val;
     59     vec.pop_back();
     60 }
     61 
     62 void dfs(vector<int> v, TreeNode*& root, int level, int target)
     63 {
     64     if (!root)
     65         return;
     66     v[level++] = root->val;
     67     int sum = accumulate(v.begin(), v.end(),0);
     68     if (!root->left && !root->right && sum == target)
     69     {
     70         isFind = true;
     71         for (int i = 0; i < level; ++i)
     72         {
     73             if (i != 0)
     74                 cout << ",";
     75             cout << v[i];
     76         }
     77         cout << endl;
     78     }
     79     if (root->left)
     80         dfs(v, root->left, level, target);
     81     if (root->right)
     82         dfs(v, root->right, level, target);
     83 }
     84 
     85 int main()
     86 {
     87     TreeNode* root = nullptr;
     88     int target;
     89     cin >> target;
     90     string val;
     91     cin >> val;
     92     string temp;
     93     stringstream ss(val);
     94     int node;
     95     vector<int> nodes;
     96     while (!ss.eof())
     97     {
     98         getline(ss, temp, ',');
     99         stringstream stmp;
    100         stmp << temp;
    101         stmp >> node;
    102         nodes.push_back(node);
    103     }
    104     creatTree(root, nodes, 0, nodes.size());
    105 //     pathTree(root,target);
    106 //     if (!isFind)
    107 //         cout << "error";
    108     vector<int> vec(nodes.size());
    109     dfs(vec, root, 0, target);
    110     if (!isFind)
    111         cout << "error";
    112 }
  • 相关阅读:
    构建之法阅读心得(九)
    构建之法阅读心得(八)
    构建之法阅读心得(七)
    构建之法阅读心得(六)
    构建之法阅读心得(五)
    构建之法阅读心得(四)
    一组阶段小记之读构建之法(三)
    暑期学习总结
    软工综合实践 学习笔记02
    软工综合实践 学习笔记01
  • 原文地址:https://www.cnblogs.com/zhangbaochong/p/5777498.html
Copyright © 2020-2023  润新知