题目1523:从上往下打印二叉树
时间限制:1 秒
内存限制:128 兆
特殊判题:否
提交:1520
解决:630
-
题目描述:
-
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
-
输入:
-
输入可能包含多个测试样例,输入以EOF结束。
对于每个测试案例,输入的第一行一个整数n(1<=n<=1000, :n代表将要输入的二叉树元素的个数(节点从1开始编号)。接下来一行有n个数字,代表第i个二叉树节点的元素的值。接下来有n行,每行有一个字母Ci。
Ci=’d’表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号。
Ci=’l’表示第i个节点有一个左孩子,紧接着是左孩子的编号。
Ci=’r’表示第i个节点有一个右孩子,紧接着是右孩子的编号。
Ci=’z’表示第i个节点没有子孩子。
-
输出:
-
对应每个测试案例,
按照从上之下,从左至右打印出二叉树节点的值。
-
样例输入:
-
7 8 6 5 7 10 9 11 d 2 5 d 3 4 z z d 6 7 z z
-
样例输出:
-
8 6 10 5 7 9 11
-
思路: 核心部分---利用队列。 先将根节点入队,出队,若左右孩子节点不为空,入队,(每步出队时显示该节点的值),出队,入队,出队... ...,队列为空时,循环结束。
-
#include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <iostream> using namespace std; typedef struct node //树的结构体 { int data; struct node *left, *right; }node,*tree; typedef struct queue //队列结构体 { node data; struct queue *next; }queue, *Qqueue; typedef struct //队列结构体 { Qqueue front, rear; }LinkQueue; void pushqueue(LinkQueue *L, tree data) //入队列 { Qqueue p = (Qqueue)malloc(sizeof(queue)); p->data = *data; p->next = NULL; L->rear->next = p; L->rear = p; } void popqueue(LinkQueue *L, node *data) //出队 { Qqueue p = (Qqueue)malloc(sizeof(queue)); p = L->front->next; *data = p->data; L->front = p; if (p == L->rear) { L->rear = L->front; } } void initqueue(LinkQueue *L) //队列初始化 { L->rear = L->front = (Qqueue)malloc(sizeof(queue)); L->front->next = NULL; } int empty(LinkQueue L) //队列判断空 { if (L.rear != L.front) { return 1; } return 0; } void init(node *A[]) { int i; for ( i = 1; i < 1001; i++) { A[i] = NULL; } } int main() { int n, num,a,b; char ch; while (scanf("%d", &n) != EOF) { node *A[1001]; init(A); int i; for (i = 1; i <= n; i++) { scanf("%d", &num); node *p = (node*)malloc(sizeof(node)); p->data = num; p->left = NULL; p->right = NULL; A[i] = p; } for (int i = 1; i <= n; i++) { cin >> ch; if (ch == 'd') { scanf("%d%d", &a, &b); A[i]->left = A[a]; A[i]->right = A[b]; } if (ch == 'l') { scanf("%d", &a); A[i]->left = A[a]; } if (ch == 'r') { scanf("%d", &a); A[i]->right = A[a]; } if (ch == 'z') { continue; } } LinkQueue L; initqueue(&L); pushqueue(&L, A[1]); int flag = 1; while (empty(L)) { node data; if (flag == 1) { popqueue(&L, &data); printf("%d", data.data); } else { popqueue(&L, &data); printf(" %d", data.data); } flag++; if (data.left != NULL) { pushqueue(&L, data.left); } if (data.right != NULL) { pushqueue(&L, data.right); } } printf("\n"); } return 0; }
-