【二叉树】UVA112

一种极其精妙的建树方法,认真领悟递归思想
#include<stdio.h>
#include<string.h>

#define N 10005
struct node{
	int value;
	node *left;
	node *right;
	node(){
		value = 0;
		left = right = NULL;
	}
};

int n, num[N];

node *build(){
	char c;
	int cnt = 0, flag = 0;
	node *now;
	now = new node;

	while (scanf("%c", &c)){
		if (c >= '0' && c <= '9'){
			now -> value = now -> value * 10 + c - '0';
		}
		else if (c == '(' && cnt == 0){
			now -> left = build();
			cnt++;
		}
		else if (c == '(' && cnt == 1){
			now -> right = build();
			cnt++;
		}
		else if(c == ')')
			break;
		else if (c == '-')
			flag = 1;
	}

	if (flag)
		now -> value = - now -> value;
	if (now -> value == 0 && cnt == 0)
		return NULL;
	else
		return now;
}

void BFS(node * now, int sum){
	if (now == NULL)
		return;
	sum += now -> value;

	if (now -> left == NULL && now -> right == NULL)
		num[n++] = sum;
	else{
		if (now -> left != NULL)
			BFS(now -> left, sum);
		if (now -> right != NULL)
			BFS(now -> right, sum);
	}
}	
void delete_tree(node * now){
	if (now == NULL)
		return ;
	if (now -> left != NULL)
		delete_tree(now -> left);
	if (now -> right != NULL)
		delete_tree(now -> right);
	delete now;
}
int main(){
	int sum;
	char c;
	node *head;
	while (scanf("%d", &sum) != EOF){
		// Init.
		memset(num, 0, sizeof(num));
		head = NULL;
		n = 0;
		// Build tree;
		while (scanf("%c", &c) != EOF){
			if (c == '('){
				head = build();
				break;
			}
		}
		// BFS.
		BFS(head, 0);
		// Judge.
     		int i;
		for (i = 0; i < n; i++)
			if (num[i] == sum)
				break;
		if (i == n)
			printf("no\n");
		else
			printf("yes\n");
		// Delete.
		delete_tree(head);
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值