题目链接:
题目大意:
按题目要求建立二叉树,层次遍历即可。
输入格式为:
(11,LL) (7,LLL) (8,R)
(5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) ()
(3,L) (4,R) ()
空括号表示结束一颗树的输入,前面的表示值,后面表示节点,由根节点到这个节点的路径表示。
解题过程:
- 毕竟第一次写二叉树,照着书上过了一遍。
- 发现其实不难,只要自己多写几个函数,想好思路。
- C++的new语句需要去查下资料了,好像和JAVA的差不多。
题目分析:
首先先读取读取输入数据,这里用sscanf从字符串里读取的方法,读取了节点的值(get!)。
sscanf(&s[1], "%d", &v);
addnode(v, strchr(s, ',')+1);
这里读取数据中的路径和数字的方法非常巧妙。然后根据路径和值建树。
- 最后用BFS层次遍历,并输出。
- -
AC代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
const int MAX = 11234;
struct node
{
int v;
bool have_value;
node *left, *right;
node():have_value(false), left(NULL), right(NULL){}
}*root;
char s[MAX];
node* newnode()
{
return new node();
}
bool failed;
void addnode(int v, char* s)
{
node *u = root;
int n = strlen(s);
for (int i = 0; i < n; i++)
{
if (s[i] == 'R')
{
if (u->right == NULL)
{
u->right = newnode();
}
u = u->right;
}
else if (s[i] == 'L')
{
if (u->left == NULL)
{
u->left = newnode();
}
u = u->left;
}
}
if (u->have_value)
failed = true;
u->v = v;
u->have_value = true;
}
bool read_input()
{
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);
if (u->left != NULL)
q.push(u->left);
if (u->right != NULL)
q.push(u->right);
}
return true;
}
int main()
{
// freopen("in", "r", stdin);
vector<int> ans;
while(read_input())
{
if (failed || !bfs(ans))
cout << "not complete" << endl;
else
{
for (int i = 0; i < ans.size(); i++)
{
if (i != 0)
cout << ' ';
cout << ans[i];
}
cout << endl;
}
}
}
自己加了BFS遍历的版本:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
const int MAX = 11234;
struct node
{
int v;
bool have_value;
node *left, *right;
node():have_value(false), left(NULL), right(NULL){}
}*root;
char s[MAX];
vector<int> ans;
node* newnode()
{
return new node();
}
bool failed;
void addnode(int v, char* s)
{
node *u = root;
int n = strlen(s);
for (int i = 0; i < n; i++)
{
if (s[i] == 'R')
{
if (u->right == NULL)
{
u->right = newnode();
}
u = u->right;
}
else if (s[i] == 'L')
{
if (u->left == NULL)
{
u->left = newnode();
}
u = u->left;
}
}
if (u->have_value)
failed = true;
u->v = v;
u->have_value = true;
}
bool read_input()
{
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()
{
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);
if (u->left != NULL)
q.push(u->left);
if (u->right != NULL)
q.push(u->right);
}
return true;
}
bool dfs1(node* u)
{
ans.push_back(u->v);
if (u->left != NULL)
dfs1(u->left);
if (u->right != NULL)
dfs1(u->right);
}
bool dfs2(node* u)
{
if (u->left != NULL)
dfs2(u->left);
ans.push_back(u->v);
if (u->right != NULL)
dfs2(u->right);
}
bool dfs3(node* u)
{
if (u->left != NULL)
dfs3(u->left);
if (u->right != NULL)
dfs3(u->right);
ans.push_back(u->v);
}
void put()
{
for (int i = 0; i < ans.size(); i++)
{
if (i != 0)
cout << ' ';
cout << ans[i];
}
cout << endl;
}
int main()
{
// freopen("in", "r", stdin);
while(read_input())
{
if (failed || !bfs())
cout << "not complete" << endl;
else
{
put();
ans.clear();
dfs1(root);
put();
ans.clear();
dfs2(root);
put();
ans.clear();
dfs3(root);
put();
}
}
}