PAT1020 Tree Traversals

已知中序遍历 后序遍历,求层次遍历

Sample Input:

7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
Sample Output:
4 1 6 3 5 7 2

#include <string.h>
#include <iostream>
using namespace std;
#define MAX_TREE_SIZE 30
typedef struct BiTNode 
{    
	int data;    
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree; 

BiTree CreateBT(int *postorder,int *inorder,int n)
{    
	BiTree bt;    
	int *p;    
	int k;    
	if (n<=0)     
	{        
		return NULL;    
	}    
	bt=(BiTree)malloc(sizeof(BiTNode));    
	bt->data = *(postorder);    
	for(p = inorder; p < inorder + n; p++)    
	{        
		if (*p == *postorder)
		{            
			break;        
		}    
	}    
	k = p-inorder;    
	bt->lchild = CreateBT(postorder-n+k,inorder,k);    
	bt->rchild = CreateBT(postorder-1,p+1,n-k-1);    
	return bt;
} 


void LevelOrder(BiTree b, int K)
{
	int Tree[MAX_TREE_SIZE] = {0};
	int i = 0;
	BiTree p;
	BiTree qu[MAX_TREE_SIZE];   //定义环形队列,存放结点指针
	int front = -1, rear = -1;	//定义队头和队尾指针
	rear++;
	qu[rear] = b;				//根结点指针进入队列
	while (front != rear)		//队列不为空
	{
		front = (front+1)%MAX_TREE_SIZE;
		p = qu[front];			//队头出队列
		Tree[i++] = p->data;	//访问结点
		if (p->lchild != NULL)	//有左孩子时将其进队
		{ 
			rear = (rear+1)%MAX_TREE_SIZE;
			qu[rear] = p->lchild;
		}
		if (p->rchild != NULL)	//有右孩子时将其进队
		{ 
			rear = (rear+1)%MAX_TREE_SIZE;
			qu[rear] = p->rchild;
		}
	}

	for (int j = 0; j < K - 1; j++)
	{
		cout<<Tree[j]<<" ";
	}
	cout<<Tree[K - 1];
}

int main()
{    
	BiTree T;    
	int Tree1[MAX_TREE_SIZE] = {0};
	int Tree2[MAX_TREE_SIZE] = {0}; 
	int K;
	cin>>K;
	for (int i = 0; i < K; i++)
	{
		int x;
		cin>>x;
		Tree1[i] = x;
	}
	for (int i = 0; i < K; i++)
	{
		int x;
		cin>>x;
		Tree2[i] = x;
	}
	T = CreateBT(Tree1 + K - 1, Tree2 , K);    
	LevelOrder(T,K);
	return 0;
}
 

猜你喜欢

转载自ppcool.iteye.com/blog/1732791
今日推荐