欢迎访问我的Uva题解目录哦 https://blog.csdn.net/richenyunqi/article/details/81149109
题目描述
题意解析
输入一棵二叉树,你的任务是按从上到下、从左到右的顺序输出各个结点的值。每个结点都按照从根结点到它的移动序列给出(L表示左,R表示右)。在输入中,每个结点的左括号和右括号之间没有空格,相邻结点之间用一个空格隔开。每棵树的输入用一对空括号“()”结束(这对括号本身不代表一个结点)。
注意,如果从根到某个叶结点的路径上有的结点没有在输入中给出,或者给出超过一次,应当输出not complete。结点个数不超过256。
算法设计
采用动态二叉链表存储整棵树,根据需要建立新的结点。注意树的结点类中应包含一个域标志是否该结点已被赋值。然后按照L和R字符插入新结点,最后进行层次遍历即可。
C++代码
#include<bits/stdc++.h>
using namespace std;
struct Node{
bool value=false;//标志该结点是否已被赋值
int data;//数据域
Node*left=nullptr,*right=nullptr;//左右孩子指针
};
bool f=true;//标志一个结点是否被重复赋值
void insert(int data,string s,Node*root){//插入结点
for(auto c:s)//遍历标志结点位置的字符串
if(c=='L'){//如果是L字符,向左子树插入
if(root->left==nullptr)
root->left=new Node();
root=root->left;
}else{//如果是R字符,向右子树插入
if(root->right==nullptr)
root->right=new Node();
root=root->right;
}
if(root->value)//当前结点已被赋值
f=false;//该结点被重复赋值
root->data=data;//更新该结点数据域
root->value=true;//该结点已被赋值
}
bool levelOrder(Node*root,vector<int>&level){//层次遍历
queue<Node*>q;
q.push(root);
while(!q.empty()){
root=q.front();
q.pop();
if(!root->value)//该结点没有被赋值,返回false
return false;
level.push_back(root->data);
if(root->left!=nullptr)
q.push(root->left);
if(root->right!=nullptr)
q.push(root->right);
}
return true;
}
int main(){
string input;
Node*root=new Node();
while(cin>>input){
if(input=="()"){//是空括号,一棵树已输入完成
vector<int>level;//存储层次遍历序列
if(f&&levelOrder(root,level)){
for(int i=0;i<level.size();++i)
printf("%s%d",i>0?" ":"",level[i]);
puts("");
}else
puts("not complete");
root=new Node();
f=true;
}else{
int i=input.find(',');
insert(stoi(input.substr(1,i-1)),input.substr(i+1,input.size()-2-i),root);
}
}
return 0;
}