【问题描述】 考研真题:给定一颗二叉树,要求从下至上按层遍历二叉树,每层的访问顺序是从左到右,每一层单独输出一行。
【输入形式】 广义表表示的二叉树,结点元素类型为整型,且都大于0,例如:1( 2( 3 ( 4, 5 ) ), 6( 7, 8( 9, 10 ) ) )
【输出形式】 从下至上,打印每一层的结点元素值,元素间以空格隔开。每层的访问顺序是从左到右,每一层单独输出一行。
【样例输入】 1(2(3(4,5)),6(7,8(9,10))),字符串内没有空格
【样例输出】
4 5 9 10
3 7 8
2 6
1
【评分标准】 本题目主要考察两个知识点: 1.创建二叉树存储结构 2.按层次遍历二叉树的算法
#include <bits/stdc++.h>
using namespace std;
typedef struct tnode
{
int data;
tnode *lchild;
tnode *rchild;
} * ptree;
typedef struct qnode
{
ptree data[200];
int front, rear;
int flag[100]; //输出时用来记录层数与当前要求输出的层数是否相同
} * que;
void createtree(stack<ptree> s, ptree r, char str[], int i)
{
while (str[i] != '\0')
{
if (str[i] >= '0' && str[i] <= '9')
{
int num = 0, len = 0, store[100];
while (str[i] >= '0' && str[i] <= '9')
{
store[len++] = str[i] - '0';
i++;
}
for (int j = 0; j < len; j++)
{
num = num * 10 + store[j];
}
r->data = num;
s.push(r);
}
if (str[i] == '(')
{
i++;
r->lchild = new tnode;
r->lchild->lchild = NULL;
r->lchild->rchild = NULL;
r = r->lchild;
}
if (str[i] == ')')
{
i++;
s.pop();
r = s.top();
}
if (str[i] == ',')
{
i++;
s.pop();
r = s.top();
r->rchild = new tnode;
r->rchild->lchild = NULL;
r->rchild->rchild = NULL;
r = r->rchild;
}
}
}
void show(ptree r, que q)
{
tnode *t = NULL;
int now; //记录当前层数
q->flag[q->rear] = 0;
q->data[q->rear++] = r;
while (q->front != q->rear)
{
now = q->flag[q->front];
t = q->data[q->front++];
if (t->rchild) //因为要逆层序输出,所以先从右子树读入数据
{
q->flag[q->rear] = now + 1;
q->data[q->rear++] = t->rchild;
}
if (t->lchild)
{
q->flag[q->rear] = now + 1;
q->data[q->rear++] = t->lchild;
}
}
now = q->flag[q->rear - 1];
for (int i = q->rear - 1; i >= 0;)
{
if (q->flag[i] == now) //层数对应就输出
{
cout << q->data[i]->data << " ";
i--;
}
else
{
cout << endl;
now--;
}
}
}
int main()
{
stack<ptree> s;
char str[100];
cin >> str;
que q = new qnode;
q->rear = 0;
q->front = 0;
ptree root;
root = new tnode;
root->lchild = NULL;
root->rchild = NULL;
int i = 0;
createtree(s, root, str, i);
show(root, q);
}