题目大意: 输入一颗二叉树,给出节点的值和从根几点往下开始的位置,L左,R右。
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
本题因为不知限制节点位置,最高1>>256,所以采用动态结构,建立新的节点,将其组织成树。本题4个函数,读入数据,建立树的节点,读入树的节点,遍历树的节点。下面给出代码详细解答。
分割线:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100010;
char s[maxn]; //保存读入的节点数据
bool failed;// 保证一个点只能写一次数
vector<int> ans; //保存输出树的点
struct Node{ //建立和初始化树节点
bool have_valua;// 此节点是否有值
int v;//节点值
Node *left,*right;//左儿子,右儿子
Node() : have_valua(false),left(NULL),right(NULL){}//构造
};
Node* root;//根节点
Node* newnode(){ //开辟新的节点
return new Node();
}
void addnode(int v,char *s){//根据数据s,来判断v的位置节点
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;//找到给的位置节点u
}else if(s[i] == 'R'){//同理
if(u->right == NULL) u->right = newnode();
u = u->right;
}
if(u->have_valua) failed = true; //如果给的位置已经有值,输入错误
u->v = v;//符值
u->have_valua = true; //此节点有值
}
bool read_input(){//读入
failed = false;//初始化
root = newnode();//开辟根节点
for(;;){//读数据
if(scanf("%s",s)!=1) return false;
if(!strcmp(s,"()")) break;//一组数据的结束
int v;
sscanf(&s[1],"%d",&v);//忽略(,把值记录在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();//进一个节点u,出队
if(!u->have_valua) return false;//u无值,错误
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(bfs(ans) && !failed){//正确
for(int i = 0; i < ans.size();i++)//输出ans
if(i==0 ?printf("%d",ans[i]):printf(" %d",ans[i]));
cout<<endl;
}
else cout<<"not complete"<<endl;//错误
}
return 0;
}
最后:
programming is the most fun you can have with your clothes on.