问题 3743 --构造二叉树(完善程序)

3743: 构造二叉树(完善程序)★★★

时间限制: 1 Sec  内存限制: 128 MB
提交: 226  解决: 188
[提交][状态][命题人:]

题目描述

一棵二叉树,其节点的编号用数组A表示,比如A[5]={3,1,7,9,5},表示有5个节点

每个节点有对应的权值,用数组B表示,比如B[5]={8,2,10,4,6}。

根据给定的编号,构建一棵二叉树。

要求根节点的编号比其左子树和右子树的编号都小

比如针对上述的A,第1层的根结点只能选1

这样编号1左边的这些编号为其左子树的编号集合,即A'={3}

这样编号1右边的这些编号为其右子树的编号集合,即B'={7,9,5}

依次类推,可以得到如下这样一棵二叉树

对应的权值二叉树为右图所示

求权值二叉树中,每个数与对应层数相乘的累加和

2*1+8*2+6*2+10*3+4*4=76

#include<iostream>
using namespace std;
const int maxn=10000;
int n;
int a[maxn];
int b[maxn];
int f(int l,int r,int depth){
	if(_____(1)______)
	return 0;
	int min=maxn,mink;
	for(int i=l;i<=r;i++){
		if(min>a[i]){
			min=a[i];
			_____(2)______;
		}
	}
	int lres=f(l,mink-1,depth+1);
	int rres=_______(3)______;
	return ______(4)____+depth*b[mink];
}
int main( ){
    cin>>n;
    for(int i=0;i<n;i++)
    cin>>a[i];
    for(int i=0;i<n;i++)
    cin>>b[i];  
	cout<<____(5)_____<<endl;  
    return 0;
}

输入

一个正整数n<10000

下面一行为n个整数,表示节点的编号

下面一行为n个整数,表示每个节点的权值

输出

求权值二叉树中,每个数与对应层数相乘的累加和
样例输入
Copy
5
3 1 7 9 5
8 2 10 4 6
样例输出
Copy
76

提示

如果有相同编号的节点,比如A={3,1,5,2,3,2,4},首先选择靠前的,构造的二叉树如下图所示


来源

[提交][状态]