2019校招真题编程(十七)将满二叉树转化为求和树

这篇博客介绍了如何将满二叉树转换为求和树,提供了一道2019年校招编程题,涉及前序遍历和中序遍历的输入,输出求和树的中序遍历结果。解题关键在于找到根节点并计算节点之和。此外,文章还补充了STL中istream_iterator和ostream_iterator的概念及其在读写元素中的应用,以及istringstream的用法。
摘要由CSDN通过智能技术生成

快手

题目描述

在这里插入图片描述

输入: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++引入了ostringstreamistringstreamstringstream这三个类,要使用他们创建对象就必须包含<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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值