现在的位置: 首页 > 综合 > 正文

112 – Tree Summing

2013年01月31日 ⁄ 综合 ⁄ 共 1282字 ⁄ 字号 评论关闭
交啦好几次运行错误,原来是数组开小了,快哭死了,本体没别的难点,就是建一个简单的二叉树,然后用递归取值就行了,如果学的比较好的话可以不建树就能做

 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>
using namespace std;
int N,flag;
 struct p
{
    int pri;
    p *left,*right;
} ;
p *root;
void sum(p *y,int n)
{
    if(y!=NULL)
    {
        if(y->left==NULL&&y->right==NULL)
        {
            n+=y->pri;
            if(n==N)flag=1;
        }
        if(y->left!=NULL)
            sum(y->left,n+y->pri);
        if(y->right!=NULL)
            sum(y->right,n+y->pri);
    }
}
int main()
{
    //freopen("a.txt","r",stdin);
    int i,count1,count2,count,j,k;
    char s,str[10100];
    while(scanf("%d",&N)!=EOF)
    {
        stack<p *> v;
        memset(str,0,sizeof(str));
        count1=count2=count=0;
        while(1)
        {
            scanf("%c",&s);
            if(s=='(')count1++;
            else if(s==')')count2++;
            if(s=='('||s==')'||s=='-'||(s>='0'&&s<='9'))
                str[count++]=s;
            if(count1==count2&&count1!=0)break;
        }
        getchar();
        for(i=count-1; i>=0; i--)
        {
            if(str[i]==')'&&str[i-1]=='(')
            {
                root=new p;
                root->left=root->right=NULL;
                root->pri=0;
                root=NULL;
                v.push(root);
                i--;
            }
            else if(str[i]>='0'&&str[i]<='9')
            {
                j=i;
                count1=count2=0;
                for(i=i-1;; i--)
                    if(str[i]<'0'||str[i]>'9')break;
                for(k=i+1; k<=j; k++)
                    count1=count1*10+str[k]-'0';
                if(str[i]=='-')count1=0-count1;
                else ++i;//这里要特别注意,一定要有,即便uva的测试数据不准确,但要考虑到
                root=new p;
                root->pri=count1;
                p *root1,*root2;
                root1=v.top();
                v.pop();
                root2=v.top();
                v.pop();
                root->left=root1;
                root->right=root2;
                v.push(root);
            }
        }
        flag=0;
        sum(v.top(),0);
        if(flag)printf("yes\n");
        else printf("no\n");
    }
    return 0;
}

抱歉!评论已关闭.