Trees on the Level
Time Limit: 2 Seconds Memory Limit: 65536 KB
Trees are fundamental in many branches of computer science. Current state-of-the art parallel computers such as Thinking Machines' CM-5 are based on fat trees. Quad- and octal-trees are fundamental to many algorithms in computer graphics.
This problem involves building and traversing binary trees.
Given a sequence of binary trees, you are to write a program that prints a level-order traversal of each tree. In this problem each node of a binary tree contains a positive integer and all binary trees have fewer than 256 nodes.
In a level-order traversal of a tree, the data in all nodes at a given level are printed in left-to-right order and all nodes at level k are printed before all nodes at level k+1.
For example, a level order traversal of the tree
is: 5, 4, 8, 11, 13, 4, 7, 2, 1.In this problem a binary tree is specified by a sequence of pairs (n,s) where n is the value at the node whose path from the root is given by the string s. A path is given be a sequence of L's and R's where L indicates a left branch and R indicates a right branch. In the tree diagrammed above, the node containing 13 is specified by (13,RL), and the node containing 2 is specified by (2,LLR). The root node is specified by (5,) where the empty string indicates the path from the root to itself. A binary tree is considered to be completely specified if every node on all root-to-node paths in the tree is given a value exactly once.
Input
The input is a sequence of binary trees specified as described above. Each tree in a sequence consists of several pairs (n,s) as described above separated by whitespace. The last entry in each tree is (). No whitespace appears between left and right parentheses.All nodes contain a positive integer. Every tree in the input will consist of at least one node and no more than 256 nodes. Input is terminated by end-of-file.
Output
For each completely specified binary tree in the input file, the level order traversal of that tree should be printed. If a tree is not completely specified, i.e., some node in the tree is NOT given a value or a node is given a value more than once, then the string ``not complete'' should be printed.
Sample Input
(11,LL) (7,LLL) (8,R)
(5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) ()
(3,L) (4,R) ()
Sample Output
5 4 8 11 13 4 7 2 1
not complete
详细注解看代码,树和BFS的知识我还要继续学习!
#include<iostream>
#include<vector>
#include<cstdio>
#include<new>
#include<cstring>
#include<queue>
#define maxn 100000
using namespace std;
struct Node{
int v;//节点值
bool have_value;//是否被赋值过
Node *left,*right;
Node():have_value(false),left(NULL),right(NULL){};
};
Node* root;
char s[maxn];//保存输入的节点
bool failed=false;
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=new Node();//节点不存在,创建新节点
u=u->left;
}
else if(s[i]=='R'){
if(u->right==NULL)u->right=new Node();//节点不存在,创建新节点
u=u->right;
}//忽略其他情况,即最后那个多余的又括号
}
if(u->have_value) failed=true;
u->v=v;
u->have_value=true;
}
bool read_input(){
failed=false;
root=new Node();//创建根节点
for(;;){
if(scanf("%s",s)!=1) return false;//输入结束
if(strcmp(s,"()")==0)break;//读到结束标志,退出循环
int v;
sscanf(&s[1],"%d",&v);//读入节点值
addnode(v,strchr(s,',')+1);//查找逗号,然后插入节点(函数strchr(s,‘,’)返回字符串s中从左往右第一个‘,’的指针)
}
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(){
while(read_input()){
if(failed)
printf("not complete\n");
else{
vector<int>ans;
if(bfs(ans)){
for(vector<int>::iterator i=ans.begin();i!=ans.end();i++){
if(i!=ans.begin())
printf(" ");
printf("%d",*i);
}
printf("\n");
}
else printf("not complete\n");
}
}
return 0;
}