给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数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>
#include<vector>
#include<queue>
using namespace std;
typedef struct node {
int data;
struct node* rchild, * lchild;
}leaf;
vector<int > teil, ind;
leaf *tree;
void recover(leaf **root,int start1,int end1,int start2,int end2) {//还原二叉树
int leng;
if (end1 < start1||end2<start2) {
*root = NULL;
return;
}
*root = new leaf;
(*root)->data = teil[end1];
for (int i = start2; i <= end2; i++) {
if (ind[i] == teil[end1]) {
leng = i;
break;
}
}
recover(&((*root)->lchild), start1, start1 + leng - start2 -1, start2, leng-1);
recover(&((*root)->rchild), start1 + leng - start2 , end1 - 1, leng + 1, end2);
}
int main() {
int num;
cin >> num;
for (int i = 0; i < num; i++) {
int x;
cin >> x;
teil.push_back(x);
}
for (int i = 0; i < num; i++) {
int x;
cin >> x;
ind.push_back(x);
}
recover(&tree,0,num-1,0,num-1);
vector<int> ouput;
queue<leaf*> line;
line.push(tree);
while (!line.empty()) {//队列层次遍历二叉树
leaf* p;
p = line.front();
ouput.push_back(p->data);
line.pop();
if (p->lchild != NULL)
line.push(p->lchild);
if (p->rchild != NULL)
line.push(p->rchild);
}
cout << ouput[0];
for (int i = 1; i < num; i++) {
cout << " "<<ouput[i];
}
return 0;
}