uva 112 Tree Summing

2014-11-24 08:16:01 · 作者: · 浏览: 0

是一道标准的建树遍历问题,给你一个树的构造,也即是先序遍历。然后遍历找出每个叶子从根到叶的权值之和,判断是否与所求相同。

二叉树搞得我抓耳挠腮的,还是由于不太熟悉的原因,加上这道题的输入不太好搞,几度想放弃治疗,不过还是挺过来了。

递归建二叉树。

代码:

#include
  
   
#include
   
     #include
    
      #include
     
       #include
       #include
       
         #include
        
          #include
         
           #include
          
            #include
           
             #include
            
              #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 ); continue; } dfs(root,0); if(jud) printf(yes ); else printf(no ); } }