程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> uva_112-Tree Summing

uva_112-Tree Summing

編輯:C++入門知識

[cpp] 
/**這道題的難度在於建樹,因為輸入可能不在一行,所以不能用字符串接收
 *必須一個一個讀,我這裡是用getchar(),(當然scanf也行),每次讀取到
 *‘(’時,開始接收數據,如果是‘)’,子樹為空,否則的話就是數字(可能是
 *負數),這裡有一個注意的地方就是空格,也坑了我很久,當時沒有想到windows
 *和linux的差異,最後用庫函數isspace解決。。。
 */ 
#include <cstdio> 
#include <cctype> 
using namespace std; 
 
struct Node { 
    int v; 
    Node *lc, *rc; 
}; 
 
bool flag; 
 
void pre_create_tree(Node *&root) { 
    char c; 
    int v = 0, leap = 0; 
    if( !flag ) while( getchar() != '(' ); 
    while( c = getchar() ){ 
        if( isspace(c) ) continue; 
        if( c == '(' || c == ')' ) break; 
        if( c == '-' ) {leap = 1; continue ;} 
        v *= 10; 
        v += c - '0'; 
    } 
    if( ')' == c ){ 
        root = NULL; 
        flag = false; 
    } 
    else { 
        flag = true; 
        if( leap ) v = -v; 
        root = new Node; 
        root->v = v; 
        pre_create_tree(root->lc); 
        pre_create_tree(root->rc); 
    } 

 
void pre_traverse(Node *root, int ans){ 
    if( flag ) return ; 
    if( !root ) return ; 
    ans -= root->v; 
    if( root->lc ) pre_traverse(root->lc, ans); 
    if( root->rc ) pre_traverse(root->rc, ans); 
    if( !ans && !root->lc && !root->rc ) flag = true; 

 
int main(int argc, char const *argv[]) { 
#ifndef ONLINE_JUDGE 
    freopen("test.in", "r", stdin); 
#endif 
    int ans, c; 
    while( ~scanf("%d", &ans) ) { 
        Node *root; 
        flag = false; 
        pre_create_tree(root); 
        while( c = getchar() ){ 
            if( c == '\n' ) break; 
            if( c == EOF ) break; 
        } 
        pre_traverse(root, ans); 
        if( flag ) printf("yes\n"); 
        else printf("no\n"); 
 
    } 
    return 0; 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved