题目描述
给出一棵二叉树的后序遍历序列和中序遍历序列,求这棵二叉树的层序遍历序列。
输入样例:
中序:{1,2,3,4,5,6,7};
后序:{2,3,1,5,7,6,4};
输出样例:
层序:{4,1,6,3,5,7,2};
题目解析:
将树看成三部分
根结点
左子树
右子树
然后:
因为后序遍历的最后一个结点为根结点
所以从中序遍历中找到根结点,然后分别构造中序的前半数组和后序的前半数组
还有中序的后半数组和后序的后半数组
然后继续递归,即可构造一棵二叉树
代码如下:
#include<iostream>
using namespace std;
#include<queue>
#include <vector>
//结点定义
struct node
{
int data;//数据域
int layer;//层次
node* lchild;
node* rchild;
};
//根据中序和后续遍历来构建二叉树
node* create(vector<int> vin, vector<int> post) {
if (vin.empty() || post.empty() || vin.size() != post.size())
{
return NULL;
}
vector<int> vin_left, vin_right, post_left, post_right;
int i = 0;
for (i = 0; i < vin.size(); i++)
{
if (post[post.size() - 1] == vin[i])
{
break;
}
vin_left.push_back(vin[i]);
post_left.push_back(post[i]);
}
for (int j = i + 1; j < vin.size(); j++)
{
vin_right.push_back(vin[j]);
post_right.push_back(post[j - 1]);
}
node* root = new node;
root->data = post[post.size() - 1];
root->lchild = create(vin_left, post_left);
root->rchild = create(vin_right, post_right);
return root;
}
//层序遍历
void bfs(node* root) {
if (root == NULL)
{
return;
}
queue<node*> q;
q.push(root);
while (!q.empty())
{
node* top = q.front();
q.pop();
cout << top->data << endl;
if (top->lchild)
{
q.push(top->lchild);
}
if (top->rchild)
{
q.push(top->rchild);
}
}
}
int main() {
int vin_arr[] = { 1,2,3,4,5,6,7 };
int post_arr[] = { 2,3,1,5,7,6,4 };
vector<int> vin,post;
for (int i = 0; i < 7; i++)
{
vin.push_back(vin_arr[i]);
post.push_back(post_arr[i]);
}
node* root = create(vin, post);
bfs(root);
system("pause");
return 0;
}