题目链接:【UVa 122】
输入一棵二叉树,二叉树上的点不超过156个,输出先序遍历
紫书P150
#include <bits/stdc++.h>
using namespace std;
vector<int>ans;
bool failed;
struct node
{
bool have_value;//判断是否被赋值过
int v;
node *left, *right;
node():have_value(false),left(NULL),right(NULL){}
};
node *root;//二叉树的根节点
void remove_tree(node* u)
{
if(u == NULL) return;
remove_tree(u->left);//释放左子树的空间
remove_tree(u->right);//释放右子树的空间
delete u;
}
node* newnode()
{
return new node;
}
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 read_input()
{
char s[3000];
failed = false;
remove_tree(root);//释放二叉树
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;
}
int main()
{
while(read_input())
{
if(failed || !bfs()) printf("not complete\n");
else
{
for(int i=0; i<ans.size(); i++)
{
if(i) printf(" ");
printf("%d", ans[i]);
}
printf("\n");
}
}
return 0;
}
/*
(11,LL) (7,LLL) (8,R) (5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) ()
(3,L) (4,R) ()
*/
其实这一题用数组做也是可以的,边输入边标记这个点
假设输入的第一个点是(2, LLLRR),根节点是1,LLLRR就是往左三次,往右两次,根节点没有左儿子,创建一个节点2作为它的左儿子,同理节点2的左儿子是3,节点3的右儿子是4,节点4的右儿子是5,因此a[5].val=2
样例中第一组数据可以画成下面这张图:(11,LL) (7,LLL) (8,R) (5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) ()
#include <bits/stdc++.h>
using namespace std;
struct node
{
int left, right, val;
// node():left(-1), right(-1), val(-1){}
}a[300];
bool failed;
int len=1;
vector<int>ans;
void add(int num, char* s)
{
int n=strlen(s), pos=1;
for(int i=0; i<n-1; i++)
{
if(s[i]=='L')
{
if(a[pos].left==-1) a[pos].left=++len;
pos=a[pos].left;
}
else if(s[i]=='R')
{
if(a[pos].right==-1) a[pos].right=++len;
pos=a[pos].right;
}
}
if(a[pos].val!=-1) failed=true;
a[pos].val=num;
}
bool read_input()
{
char s[3000];
failed = false;
memset(a, -1, sizeof(a));
for(;;)
{
if(scanf("%s", s)!=1) return false;
if(!strcmp(s,"()")) break;
int v;
sscanf(&s[1], "%d", &v);
add(v,strchr(s,',')+1);
}
return true;
}
bool bfs()
{
queue<node>q;
q.push(a[1]);
ans.clear();
while(!q.empty())
{
node s=q.front();q.pop();
if(s.val==-1) return false;
ans.push_back(s.val);
if(s.left!=-1) q.push(a[s.left]);
if(s.right!=-1) q.push(a[s.right]);
}
return true;
}
int main()
{
while(read_input())
{
if(failed || !bfs()) printf("not complete\n");
else
{
for(int i=0; i<ans.size(); i++)
{
if(i) printf(" ");
printf("%d", ans[i]);
}
printf("\n");
}
}
return 0;
}
/*
(11,LL) (7,LLL) (8,R) (5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) ()
(3,L) (4,R) ()
*/