快手
题目描述
输入:2行整数,第1行表示二叉树的前序遍历,第2行表示二叉树的中序遍历,以空格分割
输出:1行整数,表示求和树的中序遍历,以空格分割
解题思路
找到根节点,计算节点之和;
满二叉树节点为基数,其中偶数下标必定为0;
节点跟前序无关
链接:https://www.nowcoder.com/questionTerminal/b31734e46ba644de85a9cf95bbd57a5f
来源:牛客网
#include <iostream>
#include <sstream>
#include <vector>
#include <string>
#include <iterator>
#include <algorithm>
#include <numeric>
using namespace std;
void sumtree(vector<int> &inorder, int left, int right){
int mid = (left + right)/2;
if(mid == left){
inorder[mid] = 0;
return;
}
inorder[mid] = accumulate(inorder.begin()+left, inorder.begin()+right, -inorder[mid]);
sumtree(inorder, left, mid);
sumtree(inorder, mid+1, right);
}
int main(void){
string line;
getline(cin, line);
istringstream pre_stream(line);
vector<int> preorder((istream_iterator<int>(pre_stream)), istream_iterator<int>());
getline(cin, line);
istringstream in_stream(line);
vector<int> inorder((istream_iterator<int>(in_stream)), istream_iterator<int>());
sumtree(inorder, 0, inorder.size());
copy(inorder.begin(), inorder.end(),ostream_iterator<int>(cout, " "));
cout<<endl;
return 0;
}
知识补充
1.STL中istream_iterator和ostream_iterator
-
支持单一型别的元素读取和写入
-
使用这两个iteratorclasses之前,先得含入iterator头文件: `include
-
需要一对iterators:first和last,用来标示元素范围
istream_iterator<string> is( cin); //提供了一个firstiterator,将is定义为一个“连结至标准输人装置(cin)”的istream_iterator。
//还需要一个lastiterator,表示“欲读取之最后元素的下一位置”。
//定义istream_iterator时不为它指定istream对象,它即代表了end-of-file(文件尾)。
istream_iterator<string> eof;
string text;
copy( is, eof, back_inserter( text ));//copy()由于不知道要为vector保留多少空间,所以我选用back_inserter
ostream_iterator<int> os(cout,", ");//绑定标准输出装置,选择在各输出字符串之间以空白加以分隔
copy(text.begin(),text.end(),os);
2. istringstream
C++引入了ostringstream
、istringstream
、stringstream
这三个类,要使用他们创建对象就必须包含<sstream>
这个头文件。
- istringstream类用于执行C++风格的串流的输入操作。
- ostringstream类用于执行C++风格的串流的输出操作。
- strstream类同时可以支持C++风格的串流的输入输出操作。
#include<iostream>
#include<sstream> //istringstream 必须包含这个头文件
#include<string>
using namespace std;
int main()
{
string str="i am a boy";
istringstream is(str);
string s;
while(is>>s)
{
cout<<s<<endl;
}
}
i
am
a
boy
3. vector由istream_iterator构造
vector<string> col((istream_iterator<string>(cin)), istream_iterator<string>());
#include <iostream>
#include <iterator>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
ifstream ifs("test.txt");
istream_iterator<string> ibeg(ifs);
istream_iterator<string> iend;
vector<string> vec(ibeg, iend);
// 和在一起
// vector<string> vec((istream_iterator<string>(ifs)), istream_iterator<string>());
copy(vec.begin(), vec.end(),ostream_iterator<string>(cout, "\n"));
return 0;
}