求出二叉树中同一层结点数据之和最大的层。
输入:
先序遍历顺序输入二叉树为
ABD0G000CE00F00\先序二叉树序列
1 2 3 0 4 0 0 0 5 6 0 0 7 0 0 \对应结点保存的数值
输出:
3\第三层结点数据之和最大
16\数据之和是多少
输入输出样例:1组
#1
样例输入:
ABD0G000CE00F00
1 2 3 0 4 0 0 0 5 6 0 0 7 0 0
样例输出:
3
16
//注意
//1:该程序每次运行的时间必须小于10秒,否则会超时,程序超时将不会测试剩余的测试集
//2:该程序每次运行使用的内存不能超过1M,否则会返回错误
//3:该程序每次运行输出的结果最多显示1000个字符(多余的不显示),每行末尾的所有空格用□表示
#include <iostream>
#include<cmath>
#define M 1024
using namespace std;
typedef struct bitnode
{
int data;
char node;
struct bitnode *lchild, *rchild;
}BiTNode,*BiTree;
BiTree SetNode();
BiTree SetData();
void LevelOrder(BiTree bt);
int main()
{
BiTree bt;
bt=SetNode();
bt=SetData();
LevelOrder(bt);
}
BiTree SetNode()
{
BiTree bt;
char node;
cin>>node;
//if(node==" ")
//{
// bt=NULL;
//}
if(node=='0')
{
bt=NULL;
}
else
{
bt=new BiTNode;
bt->node=node;
bt->lchild=SetNode();
bt->rchild=SetNode();
}
return bt;
}
BiTree SetData()
{
BiTree bt;
int data;
cin>>data;
//if(data==" ")
//{
// bt=NULL;
//}
if(data==0)
{
bt=NULL;
}
else
{
bt=new BiTNode;
bt->data=data;
bt->lchild=SetData();
bt->rchild=SetData();
}
return bt;
}
void LevelOrder(BiTree bt)
{
BiTNode *queue[M];
int front ,rear;
front=-1;rear=0;
int data[M];
int weight[M];
if(bt==NULL) return ;
queue[rear]=bt;
int i=0;
data[0]=queue[rear]->data;
while(front!=rear)
{
front++;
//data[i++]=queue[front]->data;
if(queue[front]->lchild!=NULL)
{
rear++;
queue[rear]=queue[front]->lchild;
data[++i]=queue[rear]->data;
}
if(queue[front]->lchild==NULL)
{
data[++i]=0;
}
if(queue[front]->rchild!=NULL)
{
rear++;
queue[rear]=queue[front]->rchild;
data[++i]=queue[rear]->data;
}
if(queue[front]->rchild==NULL)
{
data[++i]=0;
}
}
int n=i+1;
int j=0,k=1;
for(i=0;i<n;i++)
{
if(i==k-1)
{
weight[++j]=0;
k=pow(2,j);
}
weight[j]+=data[i];
}
int N;
N=j;
int max=0;
int l;
for(i=1;i<=N;i++)
{
if(max<weight[i])
{
l=i;
max=weight[i];
}
}
cout<<l<<endl;
cout<<max<<endl;
}