紫书学习笔记
题目传送阵
题意:输入多组二叉树数据。每组数据以“()”结束,判断能否构成一个连续无重复节点的二叉树
实现1:指针实现,指针遍历
#include<iostream>
#include<queue>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
queue<int>w;
struct Node
{
bool vis;Node *left,*right;int v;
Node():vis(false),left(NULL),right(NULL){};
};
Node* root=NULL;
char s[300];bool fail;
void remove_tree(Node* u)
{
if(u==NULL) return;
remove_tree(u->left);
remove_tree(u->right);
delete u;
}
void addnode(int v,char* s)
{
int n=strlen(s)-1;
Node *u=root;
for(int i=0;i<n;++i)
{
if(s[i]=='L')
{
if(u->left==NULL) u->left=new Node();
u=u->left;
}
else if(s[i]=='R')
{
if(u->right==NULL) u->right=new Node();
u=u->right;
}
}
if(u->vis) fail=true;
u->v=v;
u->vis=true;
}
bool read()
{
fail=false;
remove_tree(root);
root=new Node();
int v;
while(1)
{
if(scanf("%s",s)!=1) return false;
if(s[0]=='('&&s[1]==')') break;
sscanf(&s[1],"%d",&v);
addnode(v,strchr(s,',')+1);
}
return true;
}
bool bfs(queue<int>& ans)
{
queue<Node*>q;
ans=queue<int>();
q.push(root);
while(!q.empty())
{
Node* u=q.front();q.pop();
if(!u->vis) return false;
ans.push(u->v);
if(u->left!=NULL) q.push(u->left);
if(u->right!=NULL) q.push(u->right);
}
return true;
}
int main()
{
while(read())
{
if(fail) printf("not complete\n");
else
{
//cout<<"PPPP\n";
if(bfs(w))
{
while(w.size()!=1)
{
printf("%d ",w.front());
w.pop();
}
printf("%d\n",w.front());
w.pop();
}
else printf("not complete\n");
}
}
}
实现2:数组实现,数组遍历
#include<iostream>
#include<queue>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
queue<int>w;//最后读取的数
const int root =1;
int left1[100000],right1[100000],cnt,vis[100000],v[100000];
char s[300];bool fail;
int newnode()
{
++cnt;
left1[cnt]=right1[cnt]=vis[cnt]=0;
return cnt;
}
void addnode(int vi,char* s)
{
int n=strlen(s)-1;
int u=1;
for(int i=0;i<n;++i)
{
if(s[i]=='L')
{
if(!left1[u]) left1[u]=newnode();
u=left1[u];
}
else if(s[i]=='R')
{
if(!right1[u]) right1[u]=newnode();
u=right1[u];
}
}
if(vis[u]) fail=true;
v[u]=vi;
vis[u]=1;
}
bool read()
{
fail=false;
cnt=0;
newnode();
int v;
while(1)
{
if(scanf("%s",s)!=1) return false;
if(s[0]=='('&&s[1]==')') break;
sscanf(&s[1],"%d",&v);
addnode(v,strchr(s,',')+1);
}
return true;
}
bool bfs(queue<int>& ans)
{
queue<int>q;
q.push(1);
while(!q.empty())
{
int u=q.front();q.pop();
if(!vis[u]) return false;
ans.push(v[u]);
if(left1[u]) q.push(left1[u]);
if(right1[u]) q.push(right1[u]);
}
return true;
}
int main()
{
while(read())
{
if(fail) printf("not complete\n");
else
{
if(bfs(w))
{
while(w.size()!=1)
{
printf("%d ",w.front());
w.pop();
}
printf("%d\n",w.front());
w.pop();
}
else printf("not complete\n");
}
}
}
实现3:数组实现,指针遍历
#include<iostream>
#include<queue>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
queue<int>w;
struct Node
{
bool vis;Node *left,*right;int v;
Node():vis(false),left(NULL),right(NULL){};
}a[70000];Node* root=NULL;
char s[300];bool fail;
queue<Node*> freenodes;
void init() //初始化内存池
{
for(int i=0;i<70000;++i)
freenodes.push(&a[i]);
}
Node* newnode()
{
Node* u=freenodes.front();
u->left=u->right=NULL;
u->vis=false;
freenodes.pop();
return u;
}
void remove_tree(Node* u)
{
if(u==NULL) return;
remove_tree(u->left);
remove_tree(u->right);
freenodes.push(u);
}
void addnode(int v,char* s)
{
int n=strlen(s)-1;
Node *u=root;
for(int i=0;i<n;++i)
{
if(s[i]=='L')
{
if(u->left==NULL) u->left=newnode();
u=u->left;
}
else if(s[i]=='R')
{
if(u->right==NULL) u->right=newnode();
u=u->right;
}
}
if(u->vis) fail=true;
u->v=v;
u->vis=true;
}
bool read()
{
fail=false;
remove_tree(root);
root=newnode();
int v;
while(1)
{
if(scanf("%s",s)!=1) return false;
if(s[0]=='('&&s[1]==')') break;
sscanf(&s[1],"%d",&v);
addnode(v,strchr(s,',')+1);
}
return true;
}
bool bfs(queue<int>& ans)
{
queue<Node*>q;
ans=queue<int>();
q.push(root);
while(!q.empty())
{
Node* u=q.front();q.pop();
if(!u->vis) return false;
ans.push(u->v);
if(u->left!=NULL) q.push(u->left);
if(u->right!=NULL) q.push(u->right);
}
return true;
}
int main()
{
init();
while(read())
{
if(fail) printf("not complete\n");
else
{
if(bfs(w))
{
while(w.size()!=1)
{
printf("%d ",w.front());
w.pop();
}
printf("%d\n",w.front());
w.pop();
}
else printf("not complete\n");
}
}
}