题目: 将满二叉树转换为求和树
问题描述
给出满二叉树,编写算法将其转化为求和树
求和树:二叉树的求和树,是一颗同样结构的二叉树,其树中的每个结点将包含原始树中的左子树和右子树的和。
二叉树:
10
/ \
-2 6
/ \ / \
8 -4 7 5
求和树:
20(4-2+12+6)
/ \
4(8-4) 12(7+5)
/ \ / \
0 0 0 0
二叉树给出先序和中序遍历序列,求和树要求输出中序遍历序列;
所有处理数据不会大于int类型范围。
输入格式
输入共3行:第一行为满二叉树中结点个数n(n<1024);第二行为n个整数,表示二叉树的先序遍历序列;第三行也有n个整数,表示二叉树的中序遍历序列。整数间以空格分割。
输出格式
输出1行整数,表示求和树的中序遍历序列。整数间以空格分割。
样例输入
7
10 -2 8 -4 6 7 5
8 -2 -4 10 7 6 5
样例输出
0 4 0 20 0 12 0
典型的递归问题,还是不太好想的
#include <iostream>
#include <vector>
using namespace std;
vector<int> c;
void merge(vector<int> a, vector<int> b) {
if (b.size() == 0) {
return;
}//如果子树的长度为0则返回
vector<int> b1;
vector<int> b2;
//定义左右子树
int root = a[0];//根节点是a的第一个元素
int pos = 0, sum = 0;
for (int i = 0; i < b.size(); i++) {
if (b[i] == root) {
pos = i;
break;
}
}//寻找子树中根节点的位置
for (int i = 0; i < pos; i++) {
b1.push_back(b[i]);
sum += b[i];
}//将子树分为更小的左右子树
for (int i = pos + 1; i < b.size(); i++) {
b2.push_back(b[i]);
sum += b[i];
}//将子树分为更小的左右子树
merge(vector<int>(a.begin() + 1, a.begin() + 1 + b1.size()), b1);//a.begin() + 1, a.begin() + 1 + b1.size()此代码的意思为新的容器取a左子树
c.push_back(sum);
merge(vector<int>(a.begin() + 1 + b1.size(), a.end()), b2);//a.begin() + 1 + b1.size(), a.end()此代码的意思为取a右子树
}
int main() {
int num;
vector<int> a;
vector<int> b;
cin >> num;
for (int i = 0; i < num; i++) {
int x;
cin >> x;
a.push_back(x);
}
for (int i = 0; i < num; i++) {
int x;
cin >> x;
b.push_back(x);
}
merge(a, b);
for (int i = 0; i < c.size(); i++) {
cout << c[i] << " ";
}
return 0;
}