• 剑指offer系列18:二叉树中和为某一值得路径


    记录几个问题:首先,这道题目要打印出该路径,那么该路径如何存储?

    树的结构只能从根结点向下走,而不能向父节点寻找。因此寻找出一条路径的时候,存储这个路径必须借助其他的数据结构,没有比vector更适合的了。

    如何遍历整个树?

    这是很经典的问题,这道题目要从根结点->左子树->右子树。这是很明显的前序遍历,用递归(树)。

     1 #include<iostream>
     2 #include<vector>
     3 using namespace std;
     4 struct TreeNode {
     5     int val;
     6     struct TreeNode *left;
     7     struct TreeNode *right;
     8 };
     9 
    10 class Solution {
    11 public:
    12     vector<vector<int>> re;//数据成员
    13     vector<vector<int> > FindPath(TreeNode* root1, int expectNumber1) {
    14         if (root1 == NULL)
    15             return re;
    16         int count = 0;
    17         vector<int> temp;
    18         findit(root1,expectNumber1, temp, count);
    19         return re;
    20     }
    21     //在递归函数中不能建立新的变量,可以建立静态变量
    22     void findit(TreeNode* root, int expectNumber,  vector<int> v2, int countsum)
    23     {
    24         countsum += root->val;
    25         v2.push_back(root->val);//v2用来存储当前vector
    26         bool isleaf = root->left == NULL&&root->right == NULL;
    27         if (countsum == expectNumber&&isleaf)
    28         {
    29             //输出这个vector
    30             for (int i = 0; i < v2.size(); i++)
    31             {
    32                 cout << v2[i] << " ";
    33             }
    34             cout << endl;
    35             re.push_back(v2);
    36         }
    37         if (root->left != NULL)
    38             findit(root->left, expectNumber,v2, countsum);
    39         if (root->right != NULL)
    40             findit(root->right, expectNumber, v2, countsum);
    41         //v2.pop_back();//如果使用静态变量需要恢复现场
    42     }
    43 
    44 };
    45 
    46 
    47 int main()
    48 {
    49     //  0  1  2  3 4
    50     //  {10,5,12,4,7},22
    51     TreeNode TreeNode[5];
    52     TreeNode[0].val = 10;
    53     TreeNode[0].left = &TreeNode[1];
    54     TreeNode[0].right = &TreeNode[2];
    55 
    56     TreeNode[1].val = 5;
    57     TreeNode[1].left = &TreeNode[3];
    58     TreeNode[1].right = &TreeNode[4];
    59 
    60     TreeNode[2].val = 12;
    61     TreeNode[2].left = NULL;
    62     TreeNode[2].right = NULL;
    63 
    64     TreeNode[3].val = 4;
    65     TreeNode[3].left = NULL;
    66     TreeNode[3].right = NULL;
    67 
    68     TreeNode[4].val = 7;
    69     TreeNode[4].left = NULL;
    70     TreeNode[4].right = NULL;
    71 
    72     Solution solu;
    73     vector< vector<int> > res = solu.FindPath(&TreeNode[0], 22);
    74     cout << "size = " << res.size()<<endl;
    75     /*
    76     for (int i = 0; i < res.size(); i++)
    77     {
    78         for (int j = 0; j < res[i].size(); j++)
    79         {
    80             cout << res[i][j] << " ";
    81         }
    82         cout << endl;
    83     }
    84     */
    85     return 0;
    86 }

    树的遍历,很重要的问题,一定要会!各种遍历方法都要熟悉。

  • 相关阅读:
    微信小程序购物商城系统开发系列-工具篇
    CSS实现导航条Tab切换的三种方法
    最详细win7下手动搭建PHP环境:apache2.4.23+php7.0.11
    读书笔记:《HTML5开发手册》Web表单
    jQuery可拖拽3D万花筒旋转特效
    框架基础:关于ajax设计方案(三)---集成ajax上传技术
    框架基础:ajax设计方案(二)---集成轮询技术
    框架基础:ajax设计方案(一)---集成核心请求
    Apache+PHP+MySQL
    自学 PHP,如何不走弯路?
  • 原文地址:https://www.cnblogs.com/neverland0718/p/11043376.html
Copyright © 2020-2023  润新知