#include <cstdio>
#include <string>
#include <cmath>
#include <iostream>
#include <queue>
#include <vector>
#include <cstring>
using namespace std;
const int maxn = 256 + 1;
char s[maxn];
bool failed;//判断是否已经赋值
struct node//以递归形式定义根节点
{
bool have_value;
int v;
node *left, *right;
node():have_value(false),left(NULL),right(NULL){}//结构体内构造函数
};
node *root;//定义根节点递归寻找之后的节点
node* newnode()
{
return new node();//new作为运算符申请新内存
}
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_value)failed = true;//已经赋值,赋值操作错误
u->v = v;//进行赋值
u->have_value = true;
}
bool readput()//根据需要动态申请内存
{
failed = false;//初始化,表示未出现错误
root = newnode();
for (;;)
{
if (scanf("%s", s) != 1)
return false;//循环跳出
if (!strcmp(s, "()"))
break;
int v;
sscanf(&s[1], "%d", &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();
if (!u->have_value)
return false;//遍历的前提注意为每个节点都已经进行赋值
ans.push_back(u->v);//ans作为输出的数组
if (u->left != NULL)
q.push(u->left);
if (u->right != NULL)
q.push(u->right);
}
return true;
}
int main()
{
vector<int>ans;//输出最后的结果,存储于变长数组之中
while (readput())
{
if (!bfs(ans))
{
failed = true;
}
if (failed)
{
printf("not complete\n");
}
else//输出数组中的值
{
for (int i = 0; i < ans.size(); i++)
{
if (i != 0)
printf(" ");
printf("%d", ans[i]);
}
printf("\n");
}
}
getchar();
getchar();
return 0;
}
1、二叉树建树的思想,通过递归建树的思想,利用指针,根据需要动态建立需要的节点
2、二叉树层次遍历时,利用bfs搜索,用队列实现进行,注意将其子节点放入队列,熟悉bfs操作
3、结构体内构造函数的写法,注意初始化问题,利于判断,hanve_value判断是否赋值,left与right则用于判断左右子节点是否赋值
4、new运算符的用法,用于申请新的节点空间,注意动态建立新节点
5、sscanf函数使用字符串为输入源,将字符串中数字字符自动转换为数字,可根据需要提取字符串中所需要的部分,同时也可根据长度进行提取,以后使用时注意继续熟悉
6、熟悉利用指针代表整个字符串的操作