题目:给你一个数和一棵树。问时钟是否存在根到叶子的路径使得路径上的数字和与已知数相等。
分析:递归、栈。
由于除了最外边的树外。其它都有两颗子树,直接递归求解就可以。
假设存在一棵子树成立,即返回成立。注意叶子节点的另可子树为空。叶子直接返回结果。
说明:注意数据中可能有负数。(POJ1145)
#include <iostream> #include <cstdlib> #include <cstdio> using namespace std; char input( void ) { char temp; scanf("%c",&temp); while ( temp == ' ' || temp == ' ' ) 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 "); else printf("no "); } return 0; }
測试数据:
-6 (3(-9()())()) 9 (5(4(3(2()())())())())