题目描述
输入一棵二叉树,你的任务是按从上到下、从左到右的顺序输出各个结点的值。每个结点都按照从根结点到它的移动序列给出(L代表左,R代表右)。在输入中,每个结点的左括号和右括号之间没有空格,相邻结点之间用一个空格隔开。每棵树的输入用一对空括号"()"结束(这对括号本身不代表一个结点)。
注意,如果从根节点到某个叶节点的路径上有的结点没有在输入中给出,或者给出超过一次,应当输出-1。结点个数不超过256。
样例输入
(11,LL) (7,LLL) (8,R) (5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) ()
(3,L) (4,R) ()
样例输出
5 4 8 11 13 4 7 2 1
-1
解题思路
这个题看题目的要求是要用二叉树的层次遍历实现的,这就要运用到数据结构二叉树以及层次遍历(队列以及广度搜索)。
下面以c为例,给出代码(分块代码进行解释):
首先是树:
typedef struct Node {//构造树的结点
int boolean; //判断该节点是否有被赋值
int data;//结点数据
struct Node *left, *right; //左右子树
}Node;
Node * new_Tree_Node() //创建新结点
{
Node* root;
root = (Node *)malloc(sizeof(Node));
root->boolean = 0; //没被赋值
root->left = NULL;
root->right = NULL;
return root;
}
void add_Tree_Node(Node* root, int data, char *s) //给树添加结点
{
Node *tree = root;
int i = 0;
for (i = 0; s[i] != ')'; i++)
{
if (s[i] == 'L') { //如果向左走
if (tree->left == NULL) //如果左子树为空
tree->left = new_Tree_Node(); //创建结点
tree = tree->left;
}
else { //向右走
if (tree->right == NULL) //如果右子树为空
tree->right = new_Tree_Node(); //创建结点
tree = tree->right;
}
}
tree->boolean = 1;
tree->data = data;
}
然后是队列的实现
//构建队列
typedef struct qnode {
Node * data;
struct qnode *next;
}QNode;
typedef struct queue {
QNode *front;
QNode *rear;
}Queue;
void push_QNode(Node *data,Queue *q){
if (q->rear != NULL) {
QNode* node = (QNode*)malloc(sizeof(QNode));
node->data = data;
q->rear->next = node;
q->rear = q->rear->next;
q->rear->next = NULL;
}
}
void pop_QNode(Queue *q) {
if (q->front != NULL)
q->front = q->front->next;
}
接下来是广度搜索算法的实现(简单来说就是不断把结点入列直到所有结点处理完为止)
char bfs(QNode* root,int *s)
{
char c = 'T';
Queue* q = (Queue *)malloc(sizeof(Queue));
q->front = root;
q->rear = root;
int i = 0;
while (q->front != NULL)
{
QNode* node = q->front;
if (node->data->boolean == 0)
{
c = 'N';
break;
}
s[i++] = node->data->data; //储存数据
if (node->data->left != NULL)//如果左子树不为空,入列
push_QNode(node->data->left, q);
if (node->data->right != NULL)//如果右子树不为空,入列
push_QNode(node->data->right, q);
pop_QNode(q);
}
return c;
}
主方法:
int main()
{
char s[256][256];
while (scanf("%s",s[0]))
{
//处理输入数据
int sCount = 1;
while (1) {
scanf("%s", s[sCount]);
if (strcmp(s[sCount],"()") == 0)
break;
sCount++;
}
Node* root = new_Tree_Node(); //创建根结点
for (int j = 0; j < sCount; j++) //遍历每一组数据
{
int num = 0, k = 0;
for (k = 1; s[j][k] != ','; k++) //把字符串前半部分转为数字
num = num * 10 + s[j][k] - '0';
char LR[256];
int index = 0;
for (int o = k + 1; s[j][o] != '\0'; o++)
LR[index++] = s[j][o];
LR[index] = '\0';
add_Tree_Node(root, num, LR);//构建树
}
//层次遍历
int data[256];
QNode* q = (QNode *)malloc(sizeof(QNode));//先建一个队列
q->data = root;
q->next = NULL;
char judge = bfs(q, data);
//输出
if (judge == 'T')
for (int i = 0; i < sCount; i++)
printf("%d ", data[i]);
else
printf("-1");
printf("\n");
}
}