总结一下:树的层次遍历本身这个层次遍历是完全毫无难度的,只需要用一个队列来模拟层次遍历就可以了,但是这个输入格式是真的恶心,参考了lrj的代码来看看这个输入格式咋写的,自己是真的想不到了 ,
// 树的层次遍历.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include<string>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
bool failed = false;
char s[10000];
struct Node {
Node *left, *right;
int value;
bool have_valued;
Node() :have_valued(false), left(NULL), right(NULL) {}
};
Node* root;
Node* newnode() { return new Node(); }
void remove(Node *u)//因为内存存在冲突的问题,所以在每次新建树的项目时,要将旧树全部从内存里删除掉。
{
if (u == NULL)return;
remove(u->left);
remove(u->right);
delete u;
}
void addnode(int v, char *s)
{
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;
}
else if (s[i] == 'R')
{
if (u->right == NULL)u->right = newnode();
u = u->right;
}
}if (u->have_valued)failed = true;//如果要求建立的节点已经建立,那么就出错啦
u->value = v;
u->have_valued = true;
}
bool BFS(vector<int>&ans)
{//正常的简单的层次遍历
queue<Node*> q;
ans.clear();
q.push(root);
while (!q.empty())
{
Node *u = q.front();
q.pop();
if (!u->have_valued)return false;
ans.push_back(u->value);
if (u->left)q.push(u->left);
if (u->right)q.push(u->right);
}
return true;
}
bool read_input()
{//处理输入的字符串哈
failed = false;
remove(root);//消除前一棵树的影响
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;
}
int main()
{
while (read_input())
{
vector<int> ans;
if (!BFS(ans) || failed)
{
cout << "not complete";
}
else
{
for (int i = 0;i < ans.size();i++)
{
if (i == ans.size() - 1)
{
cout << ans[i];
}
else
cout << ans[i] << " ";
}
}
cout << endl;
}
}