uva 112 - Tree Summing

 大意:判断从根到叶是否有一个sum等于给定的数

做法:

每个括号代表二叉树一个根节点,递归建立二叉树,然后遍历。

注意:1、有负数。

        2、叶子一个子节点都没有

技巧:

1、cin.clear(),cin.unget(),ungetc(c,stdin)

2、输入、建树和遍历可以同时完成,因此提供2个版本:

版本一:

#include<iostream>
using namespace std;
bool ok;
bool tree_sum(int n,int sum)
{
    int v;
    char ch;
    cin>>ch;
    if(!((cin>>v)==0))
    {
        n+=v;
        bool t=tree_sum(n,sum)|tree_sum(n,sum);
        if(!ok&&!t) ok=(n==sum); cin>>ch;
        return true;
    }
    else
    {
        cin.clear();//消除错误状态
        cin>>ch;
        return false;
    }
}
int main()
{
    int sum;
    while(cin>>sum)
    {
        ok=false;
        tree_sum(0,sum); cout<<(ok?"yes":"no")<<endl;
    }
    return 0;
}

版本二:

#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
typedef struct_node Node;
struct_node
{
    Node*left,*right;
};
bool ok;
Node* tree_sum(int n,int sum)
{
    int v;
    char ch;
    cin>>ch;
    if(!((cin>>v)==0))
    {
        n+=v;
        Node*root=(Node *)malloc(sizeof(Node));
        root->left=tree_sum(n,sum);
        root->right=tree_sum(n,sum);
        if(!ok&&root->left==NULL&&root->right==NULL)
        ok=(n==sum);
        cin>>ch;
        return root;
    }
    else
    {
        //cin.unget();
        cin.clear();
        cin>>ch;
        return NULL;
    }

}
int main()
{
    int sum;
    while(cin>>sum)
    {
        ok=false;
        Node*root=tree_sum(0,sum);
        if(ok)
        printf("yes\n");
        else
        printf("no\n");
    }
    return 0;
}

 

你可能感兴趣的:(tree)