链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=48
是一道标准的建树遍历问题,给你一个树的构造,也即是先序遍历。然后遍历找出每个叶子从根到叶的权值之和,判断是否与所求相同。
二叉树搞得我抓耳挠腮的,还是由于不太熟悉的原因,加上这道题的输入不太好搞,几度想放弃治疗,不过还是挺过来了。
递归建二叉树。
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<map> #include<queue> #include<stack> #include<vector> #include<ctype.h> #include<algorithm> #include<string> #define PI acos(-1.0) #define maxn 10005 #define INF 1<<25 #define MAX 0x7fffffff typedef long long ll; using namespace std; struct Node { int v; Node *lchild; Node *rchild; }; Node *root; int jud=0; int tot; int Buildtree(Node *&node) { char a,b; char num[105]; bool j=0,Njud=0; int n=0; while(scanf("%c",&a)) { if(a==‘-‘) { j=1; Njud=1; } else if(a>=‘0‘&&a<=‘9‘) { n*=10; n+=a-‘0‘; Njud=1; } else if(a==‘)‘&&!Njud) { node=NULL; return 0; } else if((a==‘)‘||a==‘(‘)&&Njud) { node=(Node*)malloc(sizeof(Node)); node->v=n*(j==1?-1:1); Buildtree(node->lchild); Buildtree(node->rchild); while(scanf("%c",&b)) { if(b==‘)‘)return 0; } return 0; } else if(a==‘)‘) return 0; } } int dfs(Node *&node,int a) { if(jud) return 0; if(!node->lchild&&!node->rchild) { if(a+node->v==tot) jud=1; return 0; } if(node->lchild) dfs(node->lchild,a+node->v); if(node->rchild) dfs(node->rchild,a+node->v); } int main() { while(scanf("%d",&tot)!=EOF) { jud=0; getchar(); root=NULL; Buildtree(root); if(!root) { printf("no\n"); continue; } dfs(root,0); if(jud) printf("yes\n"); else printf("no\n"); } }