• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

游戏开发

常州手机游戏开发-在二叉树中找路径

原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/youxikaifa/2018/1224/265.html

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

题目:

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

规则如下:
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

 

常州手游开发代码:
 

#include <iostream>
#include <sstream>
#include <vector>
#include <stdlib.h>
 
using namespace std;
 
struct TreeNode
{
    int val;
    TreeNode *left, *right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
 
void creatTree(TreeNode *&root, vector<int>& a, int i, int len)
{
    if (i >= len)
        return;
    root = new TreeNode(a[i]);
    creatTree(root->left, a, 2 * i + 1, len);
    creatTree(root->right,a, 2 * i + 2, len);
}
 
void inorderTraversal(TreeNode* root)
{
    if (root)
    {
        cout << root->val << " ";
        inorderTraversal(root->left);
        inorderTraversal(root->right);
    }
}
 
vector<int> vec;
int sum = 0;
bool isCoutBlank = false;
bool isFind = false;
void pathTree(TreeNode*& root, int target)
{
    sum += root->val;
    vec.push_back(root->val);
    if (sum == target && !root->left && !root->right)
    {
        isFind = true;
        if(isCoutBlank)
            cout << endl;
        isCoutBlank = true;
        for (int i = 0; i < vec.size() - 1; ++i)
        {
            cout << vec[i]<< ",";
        }
        cout << vec[vec.size() - 1];
    }
    if (root->left)
        pathTree(root->left, target);
    if (root->right)
        pathTree(root->right, target);
    sum -= root->val;
    vec.pop_back();
}
 
 
int main()
{
    TreeNode* root = nullptr;
    int target;
    cin >> target;
    string val;
    cin >> val;
    string temp;
    stringstream ss(val);
    int node;
    vector<int> nodes;
    while (!ss.eof())
    {
        getline(ss, temp, ',');
        stringstream stmp;
        stmp << temp;
        stmp >> node;
        nodes.push_back(node);
    }
    creatTree(root, nodes, 0, nodes.size());
    pathTree(root,target);
    if (!isFind)
        cout << "error";
}

常州微信小程序开发另一种方法:用多个临时vector存储路径值,不用做pop_back操作

#include <iostream>
#include <sstream>
#include <vector>
#include <numeric>
 
using namespace std;
 
struct TreeNode
{
    int val;
    TreeNode *left, *right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
 
void creatTree(TreeNode *&root, vector<int>& a, int i, int len)
{
    if (i >= len)
        return;
    root = new TreeNode(a[i]);
    creatTree(root->left, a, 2 * i + 1, len);
    creatTree(root->right,a, 2 * i + 2, len);
}
 
void inorderTraversal(TreeNode* root)
{
    if (root)
    {
        cout << root->val << " ";
        inorderTraversal(root->left);
        inorderTraversal(root->right);
    }
}
 
vector<int> vec;
int sum = 0;
bool isCoutBlank = false;
bool isFind = false;
void pathTree(TreeNode*& root, int target)
{
    sum += root->val;
    vec.push_back(root->val);
    if (sum == target && !root->left && !root->right)
    {
        isFind = true;
        if(isCoutBlank)
            cout << endl;
        isCoutBlank = true;
        for (int i = 0; i < vec.size() - 1; ++i)
        {
            cout << vec[i]<< ",";
        }
        cout << vec[vec.size() - 1];
    }
    if (root->left)
        pathTree(root->left, target);
    if (root->right)
        pathTree(root->right, target);
    sum -= root->val;
    vec.pop_back();
}
 
void dfs(vector<int> v, TreeNode*& root, int level, int target)
{
    if (!root)
        return;
    v[level++] = root->val;
    int sum = accumulate(v.begin(), v.end(),0);
    if (!root->left && !root->right && sum == target)
    {
        isFind = true;
        for (int i = 0; i < level; ++i)
        {
            if (i != 0)
                cout << ",";
            cout << v[i];
        }
        cout << endl;
    }
    if (root->left)
        dfs(v, root->left, level, target);
    if (root->right)
        dfs(v, root->right, level, target);
}
 
int main()
{
    TreeNode* root = nullptr;
    int target;
    cin >> target;
    string val;
    cin >> val;
    string temp;
    stringstream ss(val);
    int node;
    vector<int> nodes;
    while (!ss.eof())
    {
        getline(ss, temp, ',');
        stringstream stmp;
        stmp << temp;
        stmp >> node;
        nodes.push_back(node);
    }
    creatTree(root, nodes, 0, nodes.size());
//     pathTree(root,target);
//     if (!isFind)
//         cout << "error";
    vector<int> vec(nodes.size());
    dfs(vec, root, 0, target);
    if (!isFind)
        cout << "error";
}


上篇:上一篇:unity3d简单的相机跟随及视野旋转缩放
下篇:下一篇:常州微信游戏开发-字符串匹配的三种方法