2018.9 快手笔试编程题

题目描述:给你二叉树的先序和中序遍历的值,求出中序遍历的求和树。每个节点的和等于其左右孩子节点的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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值