已知中序遍历 后序遍历,求层次遍历
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; }