题目描述:给你二叉树的先序和中序遍历的值,求出中序遍历的求和树。每个节点的和等于其左右孩子节点的value的和。
思路:先建树,直接递归求和输出就好了。。
我简化了输入,原题的输入是字符串输入,当时一直段错误,卡了快一个小时,这个代码能过样例,不知道能不能过全部的数据。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
using namespace std;
const int MAXN = 55;
int pre[MAXN];
int in[MAXN];
char str[MAXN];
int flag;
struct node
{
int sum;
int value;
node *left, *right;
}*root;
node *create(int len, int *in, int *pre)
{
if(len==0)
return NULL;
node *p = new node;
int x=0;
while(*(in+x)!=*pre)
x++;
p->sum=0;
p->value=pre[0];
p->left=create(x,in,pre+1);
p->right=create(len-1-x,in+x+1,pre+x+1);
return p;
}
void print(node* r)
{
if(r==NULL)
return ;
print(r->left);
if(!flag)
{
printf("%d", r->sum);
flag=1;
}
else
printf(" %d", r->sum);
print(r->right);
}
int bfs(node* r)
{
if(r==NULL)
return 0;
if(r->left!=NULL)
{
r->sum+=bfs(r->left);
r->sum+=r->left->value;
}
if(r->right!=NULL)
{
r->sum+=bfs(r->right);
r->sum+=r->right->value;
}
return r->sum;
}
int main()
{
int n;
scanf("%d", &n);
for(int i=0;i<n;++i)
scanf("%d", &pre[i]);
for(int i=0;i<n;++i)
scanf("%d", &in[i]);
root=create(n, in, pre);
bfs(root);
print(root);
return 0;
}