思路(反思):
1. 读取串 拆分创建树(最后别忘记释放内存(我偷懒了))
2. 利用队列 实现树的层序遍历:根进队 队为空退出 否则出队 输出data域 并将出对元素的左右结点(如果有)依次入队
3. 两种情况为 "not complete" 其一 树的某结点(未被赋值)为空 其二 某结点被多次赋值(不论是否相等)
4. 注意输出格式 最后一个结点数据后无空格
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <map>
#include <queue>
#include <sstream>
using namespace std;
class TNode
{
public:
bool empty; // 记录是否被赋值过
TNode* l, *r;
int data;
public: // 初始化
TNode(bool a = true, TNode*b = NULL, TNode *c = NULL) :empty(a), l(b), r(c){}
};
int f = 0; // 记录有无某点被多次赋值
int main()
{
char str[1000];
while (1)
{
TNode * T = new TNode();
f = 0;
while (1)
{
if (scanf("%s", str) == -1)return 0;// 用scanf 返回-1 结束程序
string s(str);
if (s == "()"){ break; }
string dig = s.substr(1, s.find(",") - 1);// 拆分string
stringstream ssm(dig);// 字符串流
int t = 0;
ssm >> t;
int e = s.find(")");
TNode *p = T;
for (int i = s.find(","); i < e; i++)
{
if (s[i] == 'L'){ if (p->l == NULL)p->l = new TNode(); p = p->l; }
else if (s[i] == 'R'){ if (p->r == NULL)p->r = new TNode(); p = p->r; }
}
if (p->empty){ p->data = t; p->empty = false; }
else f = 1;
}
queue<TNode*> qTN; //用结点的指针队列 实现(树)层序遍历
qTN.push(T);
if (f)
{
cout << "not complete" << endl; continue;
}
while (qTN.empty() == false)
{
TNode *p = qTN.front();
if (p->empty == true){ cout << "not complete" ; break; }
if(p==T)cout << p->data;
else cout << " "<< p->data ;
qTN.pop();
if (p->l)qTN.push(p->l);
if (p->r)qTN.push(p->r);
}
cout << endl;
}
}