uva 112 Tree Summing

来源:互联网 发布:淘宝评论炒作多久消失 编辑:程序博客网 时间:2024/05/03 22:22

链接: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 0x7ffffffftypedef 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");    }}

0 0
原创粉丝点击