https://vjudge.net/problem/UVA-122
紫皮书P150页,题目有些长就复制了qwq
这个题的题目很好看懂,用代码实现的话可能有些难,当时看了一边书还是不太懂em.......先挖个坑吧(虽然坑已经挺多的了)
#include<bits/stdc++.h>
#include<queue>
using namespace std;
vector<int>ans;
const int maxn = 500;
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(); //申请并执行构造函数
}
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[3009];
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;
}
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;
}
的确,可能是我现在做的题有些少吧,先不急,往后看看,说不定哪天回首的时候会知新呢qwq