紫书章六例题七 树的层次遍历 UVA 122(链表)
2017-04-15 11:05
281 查看
开始看错了题目以为是一颗满二叉树,然后就很开心地开了一个数组。。最后RE。因为 题目中说的节点数是256,不一定是满的,如果全是左孩子,这个时候数组就大的不得了啦。然后可以用链表的方法
用数组模拟链表
然后用指针来写链表
用数组模拟链表
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <cmath> #include <sstream> #include <queue> using namespace std; struct node { int v; int l,r; }; node tree[300]; int sum=1; struct node1 { int v,xb; }; void judge(int i) { if(tree[i].l) {sum++;judge(tree[i].l);} if(tree[i].r) {sum++;judge(tree[i].r);} } void level() { queue <node1> q; q.push((node1){tree[1].v,1}); int gg=0; while(!q.empty()) { node1 t=q.front(); q.pop(); if(gg) printf(" "); printf("%d",t.v); gg=1; if(tree[t.xb].l) q.push((node1){tree[tree[t.xb].l].v,tree[t.xb].l}); if(tree[t.xb].r) q.push((node1){tree[tree[t.xb].r].v,tree[t.xb].r}); } } int main() { //freopen("E:\\input.txt","r",stdin); string str; memset(tree,0,sizeof(tree)); int flag=0,now=1,num=0; while(cin>>str) { if(str=="()") { if(flag||!tree[1].v) printf("not complete\n"); else{ judge(1); if( sum == num ) { level();printf("\n");} else printf("not complete\n"); } num=0;sum=1; memset(tree,0,sizeof(tree)); now=1,flag=0; } else{ num++; int cur=1; int k=str.find(','); string a1=str.substr(1,k-1); int len=str.length()-k-2; string a2=str.substr(k+1,len); stringstream ss(a1); int v; ss>>v; int temp=1; if(len==0) {if(!tree[1].v) tree[1].v=v;else flag=1;} else{ for(int i=0;i<len;i++) { if(a2[i]=='L') { if(tree[temp].l) temp=tree[temp].l; else { tree[temp].l=++now; temp=tree[temp].l; } } else if(a2[i]=='R') { if(tree[temp].r) temp=tree[temp].r; else { tree[temp].r=++now; temp=tree[temp].r; } } } if(tree[temp].v) flag=1; else tree[temp]. b881 v=v; } } } return 0; }
然后用指针来写链表
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <cmath> #include <sstream> #include <queue> using namespace std; struct node { int v; node *l,*r; node(int a=0,node *left=NULL,node *right=NULL) { v=a,l=left,r=right; } }; node *root; int sum=1; void judge(node *t) { if(t->l) {sum++;judge(t->l);} if(t->r) {sum++;judge(t->r);} } void level() { queue <node*> q;//注意这里的类型 node* q.push(root); int gg=0; while(!q.empty()) { node *t=q.front(); q.pop(); if(gg) printf(" "); printf("%d",t->v); gg=1; if(t->l!=NULL) q.push(t->l); if(t->r!=NULL) q.push(t->r); } } void remove_tree(node *u) { if(u == NULL ) return ; remove_tree(u->l); remove_tree(u->r); delete u;//new 用 delete,malloc 用free } int main()//注意要清空 { //freopen("E:\\input.txt","r",stdin); string str; int flag=0,now=1,num=0; root=new node(); while(cin>>str) { if(str=="()") { if(flag||!root->v) printf("not complete\n"); else{ judge(root); if( sum == num ) { level();printf("\n");} else printf("not complete\n"); } remove_tree(root); root=new node(); num=0;sum=1,flag=0; } else{ num++; int cur=1; int k=str.find(','); string a1=str.substr(1,k-1); int len=str.length()-k-2; string a2=str.substr(k+1,len); stringstream ss(a1); int v; ss>>v; node *temp=root; if(len==0) {if(!root->v) root->v=v;else flag=1;} else{ for(int i=0;i<len;i++) { if(a2[i]=='L') { if(temp->l!=NULL) temp=temp->l; else { temp->l=new node(); temp=temp->l; } } else if(a2[i]=='R') { if(temp->r!=NULL) temp=temp->r; else { temp->r=new node(); temp=temp->r; } } } if(temp->v) flag=1; else temp->v=v; } } } return 0; }
相关文章推荐
- 紫书章六例题七 树的层次遍历 UVA 122(链表)
- 紫书章六例题七 树的层次遍历 UVA 122(链表)
- 紫书章六例题七 树的层次遍历 UVA 122(链表)
- 紫书章六例题七 树的层次遍历 UVA 122(链表)
- 紫书章六例题七 树的层次遍历 UVA 122(链表)
- 紫书章六例题七 树的层次遍历 UVA 122(链表)
- 紫书章六例题七 树的层次遍历 UVA 122(链表)
- 例题 6-7 树的层次遍历 UVa 122 建树+宽度优先遍历
- 例题6-7 树的层次遍历(Trees on the level, Duke 1993, UVa 122)
- 例题6-7 二叉树的层次遍历 UVa 122 Trees on the level
- 例题6-7 UVA 122 - Trees on the level 树的层次遍历
- 例题6-7 树的层次遍历 UVa122
- 紫书章六例题四 悲剧文本 UVA 11988 (用数组模拟单向链表/递归)
- uva-122 树的层次遍历
- UVA 122 Trees on the level 二叉树层次遍历 数组&指针
- uva122-树的层次遍历
- 二叉树--uva122 二叉树层次遍历(结构体+指针解法)
- 紫书章六例题四 悲剧文本 UVA 11988 (用数组模拟单向链表/递归)
- uva 122 Trees on the level 二叉树的层次遍历(bfs)
- 紫书章六例题四 悲剧文本 UVA 11988 (用数组模拟单向链表/递归)