您的位置:首页 > 其它

二叉树层次遍历。

2015-06-01 11:28 204 查看
题目:

http://acm.zju.edu.cn/onlinejudge/showRuns.do?contestId=1

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;

const int maxn = 256 + 110;

struct Node{
bool have_value;
int v;
Node* left, *right;
Node():have_value(false), left(NULL), right(NULL){}
};

Node* root;

Node* newnode()
{
return new Node();
}

bool failed;
void addnode(int v, char* s)
{
int n = strlen(s);
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->have_value) failed = true;
u->v=v;
u->have_value = true;
}

void remove_tree(Node* u)
{
if(u==NULL) return;
remove_tree(u->left);
remove_tree(u->right);
delete u;
}

char s[maxn];
bool read_input(){
failed = false;
remove_tree(root);
root = newnode();
for(;;)
{
if(scanf("%s", s)!=1) return false;
if(!strcmp(s, "()")) break;
int v;
sscanf(&s[1], "%d", &v);
addnode(v, strchr(s, ',')+1);
}
return true;
}

bool bfs(vector<int>& ans)
{
queue<Node*> q;
ans.clear();
q.push(root);
while(!q.empty())
{
Node* u = q.front(); q.pop();
if(!u->have_value) return false;
ans.push_back(u->v);
if(u->left!=NULL) q.push(u->left);
if(u->right!=NULL) q.push(u->right);
}
return true;
}

int main()
{
vector<int> ans;
while(read_input())
{
if(!bfs(ans)) failed = 1;
if(failed) printf("not complete\n");
else
{
for(int i=0; i<ans.size(); i++)
{
if(i!=0) printf(" ");
printf("%d", ans[i]);
}
printf("\n");
}
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: