#include<stdio.h> //Specular reflection of a tree
#include<string.h>
#include<stdlib.h>
#define MAX 100 //树的最大结点数
typedef struct node
{
char info;
int level; //记录结点所在的层数,便于控制输出树的镜面映射的广度优先遍历
struct node *left, *right;
}BT;
void BFS(BT *T) //BFS of the Binary Tree
{
BT *q[MAX], *p, *pa;
char stack[MAX];
int front = 0, rear = 0, top = 0;
if (!T) return;
q[rear++] = T;
T->level = 1;
while (front < rear) //将镜像映射之前的树的深度优先遍历结果存储在队列中,并记录每一个结点的层数
{
pa = q[front++];
// printf("%c %d\n", pa->info,pa->level);
p = pa->left;
while (p)
{
p->level = pa->level + 1;
q[rear++] = p;
p = p->right;
}
}
front = 0;
while (front < rear) //利用栈,将同一层的结点全部入栈在一次出栈,从而达到镜像映射的目的
{
stack[top++] = q[front]->info;
while (front < rear - 1 && q[front]->level == q[front + 1]->level)
{
stack[top++] = q[front+1]->info;
front++;
}
while (top > 0)
printf("%c ", stack[--top]);
if (front < rear - 1 && q[front]->level != q[front + 1]->level)
front++;
else
break;
}
printf("\n");
}
BT *create() //Create the Binary Tree
{
BT *T;
int flag;
char c;
T = (BT *)malloc(sizeof(BT));
c = getchar(); //Receive Enter and blank
c = getchar();
scanf("%d", &flag);
if (c == '$') return NULL; //Virtual node
if (c != '$'&&flag == 1) //Leaf node
{
T->info = c;
T->left = NULL;
T->right = NULL;
return T;
}
T->info = c; //非终端结点
T->left = create();
T->right = create();
return T;
}
int main()
{
BT *T;
int N;
scanf("%d", &N); //N 并没有什么卵用
T = create();
BFS(T);
return 0;
}
DSOJ Specular reflection of a tree(树的镜面映射)
最新推荐文章于 2023-05-24 23:04:17 发布