题目:给你一个数和一棵树,问时钟是否存在根到叶子的路径使得路径上的数字和与已知数相等。
分析:递归、栈。因为除了最外边的树外,其他都有两颗子树,直接递归求解即可。
如果存在一棵子树成立,即返回成立。注意叶子节点的另可子树为空,叶子直接返回结果。
说明:注意数据中可能有负数。(POJ1145)
#include <iostream> #include <cstdlib> #include <cstdio> using namespace std; char input( void ) { char temp; scanf("%c",&temp); while ( temp == ' ' || temp == '\n' ) scanf("%c",&temp); return temp; } int deal( int v, int *leaf ) { int temp,value; scanf("%d",&value); temp = input(); int max = 0,l = 0,r = 0; if ( temp == '(' ) { if ( deal( v-value, &l ) ) max = 1; temp = input(); if ( deal( v-value, &r ) ) max = 1; temp = input(); if ( l && r ) max = (v==value); }else *leaf = 1; return max; } int main() { int n,temp; while ( ~scanf("%d",&n) ) { input(); if ( deal( n, &temp ) ) printf("yes\n"); else printf("no\n"); } return 0; }
测试数据:
-6 (3(-9()())()) 9 (5(4(3(2()())())())())
UVa 112 - Tree Summing,布布扣,bubuko.com
原文地址:http://blog.csdn.net/mobius_strip/article/details/34066019