已知中序遍历 后序遍历,求层次遍历
Sample Input:
7 2 3 1 5 7 6 4 1 2 3 4 5 6 7Sample 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;
}