1. 程式人生 > >2018天梯賽第二次訓練(1)

2018天梯賽第二次訓練(1)

1001 1002 1003是1004的一個方面,我直接放第四題了(TOJ4405

1004 : 二叉樹遍歷

時間限制(普通/Java):1000MS/3000MS     記憶體限制:65536KByte
總提交: 13            測試通過: 13

描述

給定一顆二叉樹,要求輸出遍歷該二叉樹得到的先序、中序、後序遍歷序列。本題假設二叉樹的結點數不超過1000。

輸入

輸入資料分為多組,第一行是測試資料的組數n,下面的n行分別代表一棵二叉樹。每棵二叉樹的結點均為正整數,資料為0代表當前結點為空,資料為-1代表二叉樹資料輸入結束,-1不作處理。二叉樹的構造按照層次順序(即第1層1個整數,第2層2個,第3層4個,第4層有8個......,如果某個結點不存在以0代替)

輸出

輸出每棵二叉樹的先序、中序、後序遍歷序列,每個序列佔一行。

樣例輸入

2
1 -1
1 2 3 4 5 0 6 -1

樣例輸出

 1
 1
 1
 1 2 4 5 3 6
 4 2 5 1 3 6
 4 5 2 6 3 1

提示

輸出的每個節點值前有一個空格。


二叉樹的基本內容。

#include<bits/stdc++.h>
using namespace std; 
typedef struct BinaryTree
{
	int data;
	BinaryTree *left, *right;
}tree;
tree a[2222];
int n;
//int a[2222],n;
/*
void CreateTree(tree *&T, int k)   //遞迴建立二叉樹 
{
	if(a[k]==0||k>n)
	{
		T=NULL;
		return ;
	}
	else
	{
		T=(tree*)malloc(sizeof(tree));
		T->data=a[k];
		creat(T->left, 2*k);
		creat(T->right, 2*k+1);
	}
	return ;
}*/
void visit(tree *b)
{
	if(b->data!=0)
	printf(" %d", b->data);
	return ;
}
void PreOrderTraverse(tree *t)  //先序遍歷遞迴演算法
{
	if (t){
		visit(t);
		PreOrderTraverse(t->left);
		PreOrderTraverse(t->right);
	}
	return ;
}
void InOrderTraverse(tree *t)   //中序遍歷遞迴演算法
{
	if (t){
		InOrderTraverse(t->left);
		visit(t);
		InOrderTraverse(t->right);
	}
	return ;
}
void PostOrderTraverse(tree *t)   //後序遍歷遞迴演算法
{
	if (t) {
		PostOrderTraverse(t->left);
		PostOrderTraverse(t->right);
		visit(t);
	}
	return ;
}
void LevelOrderTraverse(tree *t)   //層序遍歷演算法
{
	queue<tree*>q;
	q.push(t);
	while(!q.empty()){
		tree* t = q.front();
		q.pop();
		visit(t);
		if(t->left)q.push(t->left);
		if(t->right)q.push(t->right);
	}
	return ;
}
int main()
{
	int T,k;
	while (~scanf("%d", &T))
	{
		while (T--)
		{
			n = 0;
			while (scanf("%d", &k), k != -1)
				a[n++].data = k;
			k = 1;
			for (int j = 0;j < n;j++)
			{
				if (j + k >= n)a[j].left = NULL;
				else a[j].left = &a[j + k];
				if (j + k + 1 >= n)a[j].right = NULL;
				else a[j].right = &a[j + k + 1];
				k++;
			}
			PreOrderTraverse(a);
			printf("\n");
			InOrderTraverse(a);
			printf("\n");
			PostOrderTraverse(a);
			printf("\n");
			LevelOrderTraverse(a);
			printf("\n");
		}
	}
	return 0;
}