DSOJ Specular reflection of a tree(樹的鏡面映射)

題目鏈接

#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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章