您的位置:首页 > 其它

紫书章六例题七 树的层次遍历 UVA 122(链表)

2017-04-15 11:05 344 查看
开始看错了题目以为是一颗满二叉树,然后就很开心地开了一个数组。。最后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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: