给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
输出样例:
4 1 6 3 5 7 2
代码:
#include<iostream>
using namespace std;
typedef struct tree {
int data;
tree* left;
tree* right;
}Tree;
Tree* creat(int h[],int z[],int n) {
if (n < 1) {
return NULL;
}
Tree* G = (Tree*)malloc(sizeof(Tree));
G->data = h[n-1];
int i;
for (i = 0; z[i] != h[n - 1]; i++);
G->left = creat(h, z, i);
G->right = creat(h + i, z + i + 1, n - i - 1);
return G;
}
void LevelTravel(Tree* T) {
if (T == NULL) {
return;
}
Tree* array[31];
int left = -1;
int right = -1;
printf("%d", T->data);
array[++right] = T;
while (left != right) {
Tree* temp = array[++left];
if (temp->left != NULL) {
array[++right] = temp->left;
printf(" %d", temp->left->data);
}
if (temp->right != NULL) {
array[++right] = temp->right;
printf(" %d", temp->right->data);
}
}
}
int main() {
int n;
scanf("%d", &n);
int a[31];
int b[31];
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
for (int i = 0; i < n; i++) {
scanf("%d", &b[i]);
}
Tree* T = creat(a, b, n);
LevelTravel(T);
}
没啥好说的,后序与中序遍历恢复二叉树不会的看这个:
4-14 还原二叉树&&4-15 根据后序和中序遍历输出先序遍历
层次遍历不会的看这个: