给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数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 <cstdio>
#include <iostream>
#include <algorithm>
#include <queue>using namespace std;int in[35];
int post[35];
typedef struct Node
{int val;struct Node* lchild;struct Node* rchild;
}Node;Node a[35];//提前申请好空间
int id;
//建树
Node* build_tree(int in[],int inl,int inr,int post[],int postl,int postr)
{if(inl > inr || postl > postr) return NULL;//Node* root = new Node;Node* root = &a[id++];root -> val = post[postr];int tmp = 0;for(int i = inl;i <= inr;i++)if(in[i] == post[postr]){tmp = i;break;}root -> lchild = build_tree(in,inl,tmp - 1,post,postl,tmp - inl - 1 + postl);root -> rchild = build_tree(in,tmp + 1,inr,post,postr - inr + tmp,postr - 1);return root;
}
void test(Node* root)
{if(root){test(root->lchild);test(root->rchild);cout << root->val << " ";}
}//层次遍历
void level_order(Node* root)
{queue<Node*> q;q.push(root);bool flag = 0;while(q.size()){Node* t = q.front();q.pop();if(flag) cout << " ";flag = 1;cout << t->val;if(t->lchild) q.push(t->lchild);if(t->rchild) q.push(t->rchild);}
}
int main()
{int n = 0;cin >> n;for(int i = 1;i <= n;i++) cin >> post[i];for(int i = 1;i <= n;i++) cin >> in[i];Node* root = build_tree(in,1,n,post,1,n);//test(root);level_order(root);return 0;
}
不会的推荐看这个视频
L2-006 树的遍历 (25 分)_哔哩哔哩_bilibili
结果