xdoj319 将满二叉树转换为求和树

题目: 将满二叉树转换为求和树

问题描述

给出满二叉树,编写算法将其转化为求和树

求和树:二叉树的求和树,是一颗同样结构的二叉树,其树中的每个结点将包含原始树中的左子树和右子树的和。

二叉树:

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;
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值