这题主要是建立一个二叉树然后进行层序遍历就行。
一开始我觉得这个输入还挺难处理的,但是后面发现还好,对于一个string,用cin来读入是可以按照回车换行和空格来分割的,意味着用string一对一对空格输入,然后我们要做的就是提取出其中的val和路径,在树里面进行插入节点即可,-1代表当前节点是假节点,即还没有给出。
在处理完一组输入之后,层序遍历如果发现有val是-1的节点,我们返回false代表未完成,如果有两个节点的位置一样而值不一样,也要设置成未完成。
具体代码如下所示:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<vector>
#include<algorithm>
#include<cstring>
#include<set>
#include<map>
#include<queue>
#include<string>
using namespace std;
struct node{
int val;
node *left;
node *right;
node():val(-1),left(nullptr),right(nullptr){}
};
vector<int> ans;
string s;
bool flag;
node *root= nullptr;
bool levelOrder(node *root){
node *n;
queue<node *>q;
q.push(root);
while (!q.empty()){
n=q.front();
q.pop();
if (n->val==-1){
return false;
}
ans.push_back(n->val);
if (n->left){
q.push(n->left);
}
if (n->right){
q.push(n->right);
}
}
return true;
}
void deleteTree(node *root){
if (!root) return;
deleteTree(root->left);
deleteTree(root->right);
delete root;
}
bool addNode(int val, string str){
node *n=root;
for (int i = 0; i < str.length(); ++i) {
if (str[i]=='L'){
if (!n->left) n->left=new node();
n=n->left;
}else{
if (!n->right) n->right=new node();
n=n->right;
}
}
if (n->val!=-1){
flag=false;
return false;
}
n->val=val;
return true;
}
int main()
{
flag=true;
root=new node();
ans.clear();
while (cin>>s){
if (s=="") break;
if (s=="()"){
if (!levelOrder(root) || !flag){
printf("not complete\n");
}else{
for (int i = 0; i < ans.size()-1; ++i) {
printf("%d ",ans[i]);
}
printf("%d\n",ans[ans.size()-1]);
}
deleteTree(root);
root=new node();
flag=true;
ans.clear();
continue;
}
if (!flag) continue;
int val=0;
string str="";
for (int i = 0; i < s.size(); ++i) {
if (s[i]>='0' && s[i] <= '9'){
val=val*10+s[i]-'0';
}else if (s[i]=='L'||s[i]=='R'){
str+=s[i];
}
}
addNode(val, str);
}
return 0;
}