题意概要:输入二叉树的每一个节点的信息,建树完毕后,按照层次顺序遍历这棵树,然后将每一个节点的权值给输出来!
注意:如果从根到某个叶节点的路径上有的节点没有在输入中给出或者给出超过一次,
应该输出“not complete”.节点数不超过256个!
代码如下:(代码中有详细的注释!)此份代码用时为 9ms !
#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
const int maxn=52014;
char str[maxn];
bool failed=false;
vector<int>ans;
struct Node//节点结构体!
{
bool have_value;
int value;
Node *left,*right;
Node():have_value(false),value(0),left(NULL),right(NULL) {}
};
struct Node *root;//建立根节点!
void remove_tree(Node *now)//将树所占用的内存释放掉!
{
if(now==NULL)
return ;
remove_tree(now->left);
remove_tree(now->right);
delete now;
}
Node *newnode()//建立新节点!
{
return new Node();
}
void addnode(int num,char *s)//增加节点,同时赋值!
{
int len=strlen(s);
Node *now=root;
for(int i=0; i<len; i++)
{
if(s[i]=='L')
{
if(now->left==NULL)
now->left=newnode();//建立心新节点!
now=now->left;
}
else if(s[i]=='R')
{
if(now->right==NULL)
now->right=newnode();//建立新节点!
now=now->right;
}
}
if(now->have_value)failed=true;//如果该节点已经赋值了,那么表示输入有误!
now->value=num;//给节点赋值!
now->have_value=true;//标记该节点已经赋值了!
}
bool input()//将树j节点的信息给输入!
{
failed=false;
root=newnode();
while(1)
{
if(scanf("%s",str)!=1)return false;//错误输入
if(!strcmp(str,"()"))break;//结束输入!
int num;//对于字符串“(11,,LL)”来说,
sscanf(&str[1],"%d",&num);//此操作是取出节点权值【11】!
addnode(num,strchr(str,',')+1);//strchr(str,',')函数是
//返回字符串str中从左到右第一个字符‘,’的指针,因此strchr(str,',')+1所对应的字符串就是"LL)".
}
return true;
}
bool bfs()
{
queue<Node*>Q;//建立队列!
Q.push(root);
ans.clear();//将容器初始化!
while(!Q.empty())
{
Node *now=Q.front();
Q.pop();
if(!now->have_value)
return false;//如果这个节点的值还没有的话,那么表示输入有误!
ans.push_back(now->value);//将值存进容器!
if(now->left!=NULL)
Q.push(now->left);
if(now->right!=NULL)
Q.push(now->right);
}
return true;
}
void print()
{
for(int i=0; i<ans.size(); i++)
printf("%d%c",ans[i],i==ans.size()-1?'\n':' ');
return ;
}
int main()
{
while(input())
{
if(failed)
{
cout<<"not complete"<<endl;
continue;
}
if(bfs())
print();
else
cout<<"not complete"<<endl;
remove_tree(root);
}
return 0;
}