1. 程式人生 > >2018.9 快手筆試程式設計題

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