1020 Tree Traversals
Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and inorder traversal sequences, you are supposed to output the level order traversal sequence of the corresponding binary tree.
Input Specification:
Each input file contains one test case. For each case, the first line gives a positive integer N (≤30), the total number of nodes in the binary tree. The second line gives the postorder sequence and the third line gives the inorder sequence. All the numbers in a line are separated by a space.
Output Specification:
For each test case, print in one line the level order traversal sequence of the corresponding binary tree. All the numbers in a line must be separated by exactly one space, and there must be no extra space at the end of the line.
Sample Input:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
Sample Output:
4 1 6 3 5 7 2
大概题目意思:假设二叉树中的所有键都是不同的正整数。给定后序和中序遍历序列,应该输出对应二叉树的层序遍历序列。
分两步走:1.先建树2.再层序遍历
建树create()函数:注意node*开头因为最后返回的是根节点。参数分别是后序遍历第一个结点对应的下标、后序遍历最后一个结点对应的下标、中序遍历第一个结点对应的下标、中序遍历最后一个结点对应的下标。每次递归都找出“根节点”,得到子树的个数,从而慢慢缩小区间直至return。
node* create (int bel,int ber,int inl,int inr) {
if (bel > ber) {
return NULL;
}
node* root = new node;
root->data = be[ber];
int k;
for (k = inl; k<= inr; k++)
{
if (in[k] == be[ber]) {
break;
}
}
int numleft = k - inl;
root->left = create(bel, bel + numleft - 1, inl, k - 1);
root->right = create(bel + numleft, ber-1, k + 1, inr);
return root;
}
层序遍历:队列的使用,每当放入一个就打印一个直至为空。
void cx(node* root) {
queue<node*>sp;
sp.push(root);
while (!sp.empty())
{
node* p = sp.front();
if(p==root)
cout << p->data;
else
{
cout <<" "<< p->data;
}
sp.pop();
if (p->left != NULL) {
sp.push(p->left);
}
if (p->right != NULL) {
sp.push(p->right);
}
}
}
完整代码:
#include <bits/stdc++.h>
using namespace std;
struct node{
int data;
node* right;
node* left;
int layer;
};
int be[10001];
int in[10001];
node* create (int bel,int ber,int inl,int inr) {
if (bel > ber) {
return NULL;
}
node* root = new node;
root->data = be[ber];
int k;
for (k = inl; k<= inr; k++)
{
if (in[k] == be[ber]) {
break;
}
}
int numleft = k - inl;
root->left = create(bel, bel + numleft - 1, inl, k - 1);
root->right = create(bel + numleft, ber-1, k + 1, inr);
return root;
}
void cx(node* root) {
queue<node*>sp;
sp.push(root);
while (!sp.empty())
{
node* p = sp.front();
if(p==root)
cout << p->data;
else
{
cout <<" "<< p->data;
}
sp.pop();
if (p->left != NULL) {
sp.push(p->left);
}
if (p->right != NULL) {
sp.push(p->right);
}
}
}
int main() {
int n;
cin >> n;
//int inl, inr, bel, ber;
for (int i = 0; i < n; i++)
{
cin >> be[i];
}
for (int i = 0; i < n; i++)
{
cin >> in[i];
}
node* root1 = new node;
root1 = create(0, n-1, 0, n-1);
cx(root1);
}