紫书章六例题10 下落的树叶 UVA 699 (根据前序遍历建树)
2017-04-15 18:36
399 查看
这个题卡了蛮久。然后改过来后,发现题目意思和自己想的出了一点问题。本以为是一行是一颗树,然后题目中并没有说。所以可能好几行是一棵树。所以用了边读边建树。因为前面的那道题是有明显的标识,如果W1=0 ,建左子树,如果W2=0,建右子树。而且到了叶子节点后不用考虑其他的。但是这道题,之前的不能判断之后是不是叶子,所以。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <sstream> #include <cmath> using namespace std; struct node { int data; node *l,*r; node(int a=0,node *left=NULL,node *right=NULL) { data=a,l=left,r=right; } }; node *root; int ans[305]; void remove_tree(node *t) { if(t == NULL) return ; remove_tree(t->l); remove_tree(t->r); delete t; } int now=1,h; int qx; node *buildtree(node *t,int ht) { scanf("%d",&qx); if(qx!=-1) { if(t->l==NULL) t->l=new node(); t->l->data=qx;ans[ht-1]+=qx; buildtree(t->l,ht-1); } if(qx==-1) scanf("%d",&qx);//这里 if(qx!=-1) { if(t->r==NULL) t->r = new node(); t->r->data=qx;ans[ht+1]+=qx; buildtree(t->r,ht+1); } } int main() { //freopen("E:\\input.txt","r",stdin); int g; int case1=0; while(scanf("%d",&g)) { if(g==-1) break; memset(ans,0,sizeof(ans)); remove_tree(root); root=new node(); h=0; root->data=g; ans[160]=g; buildtree(root,160); int flag=0,num=0; // if(case1) printf("\n"); printf("Case %d:\n",++case1); for(int i=70;i<300;i++) { if(ans[i]) {if(flag) printf(" ");printf("%d",ans[i]);num++;flag=1;} } printf("\n\n"); } return 0; }
相关文章推荐
- 紫书章六例题10 下落的树叶 UVA 699 (根据前序遍历建树)
- 紫书章六例题10 下落的树叶 UVA 699 (根据前序遍历建树)
- 紫书章六例题10 下落的树叶 UVA 699 (根据前序遍历建树)
- 紫书章六例题10 下落的树叶 UVA 699 (根据前序遍历建树)
- 紫书章六例题10 下落的树叶 UVA 699 (根据前序遍历建树)
- 紫书章六例题10 下落的树叶 UVA 699 (根据前序遍历建树)
- 紫书章六例题10 下落的树叶 UVA 699 (根据前序遍历建树)
- UVA699-例题6-10 下落的树叶(The Falling Leaves,UVa 699)
- 例题6-10 下落的树叶(The Falling Leaves, UVa 699)
- 例题6-10 下落的树叶 UVa 699
- 6_10 下落的树叶(UVa699)<二叉树的DFS>
- 例题 6-7 树的层次遍历 UVa 122 建树+宽度优先遍历
- 下落的树叶(UVa 699)
- 【LeetCode】根据前序和中序遍历建树 && 根据中序遍历和后续遍历建树
- UVa 548 Tree 根据后序遍历和中序遍历建树后DFS
- UVA 699(二叉树建树与遍历)
- 紫书章六例题八 UVA 548 (中序后序建树,前序遍历求值)
- 下落的树叶 UVa699
- 紫书章六例题八 UVA 548 (中序后序建树,前序遍历求值)
- The Falling Leaves 下落的树叶 UVA 699(二叉树)