是一道標准的建樹遍歷問題,給你一個樹的構造,也即是先序遍歷。然後遍歷找出每個葉子從根到葉的權值之和,判斷是否與所求相同。
二叉樹搞得我抓耳撓腮的,還是由於不太熟悉的原因,加上這道題的輸入不太好搞,幾度想放棄治療,不過還是挺過來了。
遞歸建二叉樹。
代碼:
#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 ); } }
UVA 11889-Benefit(數學_快速枚舉因子)
[cpp] 01./* &nbs
POCO C++庫學習和分析 -- 流 (一) &n
好久木有研究DOTA了,整理篇小菜文章。 首先,我們要
ProE二次開發 Creo二次開發 MCADEx Tools
Cocos Studio1.5.0.1開發學習筆記(一),c