本题的涉及的主要算法就是利用二叉树的中序遍历和后序遍历构造二叉树,和二叉树的层序遍历。
二叉树的层序遍历是利用队列进行实现,通过代码可以直接理解,因此不再单独讲解
利用二叉树的中序遍历和后序遍历构造二叉树的算法请看下边的博文:
L2-006 树的遍历(25分)
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数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
需要注意的一点时在输出时需要控制空格的输出,否则会格式错误
/*
题目:L2-006 树的遍历 (25 分)
作者:Lucky_追梦仔
完成时间:2020/05/23
*/
#include <bits/stdc++.h>
using namespace std;
struct Node
{
int data;
Node *lchild, *rchild;
};
int a[31]; //中序遍历
int b[31]; //后序遍历
//l1为中序遍历序列的最左端;r1为中序遍历序列的最右端
//l2为后序遍历序列的最左端;r2为后序遍历序列的最右端
Node *build(int l1, int r1, int l2, int r2)
{
Node *root = new Node;
root->data = b[r2]; //后序遍历最后一个结点为根节点
int i = 0;
while (a[l1 + i] != b[r2]) //查找根节点在中序遍历序列中的位置
{
i++;
}
//a[l1+i]为根节点
//构建左子树
if (i > 0)
{
root->lchild = build(l1, l1 + i - 1, l2, l2 + i - 1);
}
else
{
root->lchild = NULL;
}
//构建右子树
if (l1 + i < r1)
{
root->rchild = build(l1 + i + 1, r1, l2 + i, r2 - 1);
}
else
{
root->rchild = NULL;
}
return root;
}
//二叉树的层序遍历
void print(Node *bt)
{
if (bt == NULL)
{
return;
}
queue<Node *> q;
q.push(bt);
int temp = 0; //控制空格的输出
while (!q.empty())
{
bt = q.front();
q.pop();
if (temp != 0)
{
cout << " ";
}
cout << bt->data;
temp++;
if (bt->lchild != NULL)
{
q.push(bt->lchild);
}
if (bt->rchild != NULL)
{
q.push(bt->rchild);
}
}
}
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> b[i];
}
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
Node *root;
root = build(0, n - 1, 0, n - 1);
print(root);
return 0;
}
提交结果:
大家好,我是Lucky_追梦仔。一个正在学习编程的小白,希望我的博文,可以帮助到您学习,或者解决您遇到的问题。