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
题解
递归建树
代码
#include <iostream> #include <vector> #include <queue> using namespace std; struct BinTree { int val; BinTree *left, *right; }; vector<int> post_order, in_order; int n; BinTree* BuildTree(BinTree *root, int l, int r, int pl, int pr) { if(l > r || pl > pr) return nullptr; root = new BinTree; root->val = post_order[pr]; root->left = root->right = nullptr; int ri = -1; for(int i=l;i<=r;i++) { if(in_order[i] == root->val) { ri = i; break; } } int mid = pl-1; for(int i=l;i<ri;i++) { for(int j=pl;j<pr;j++) { if(in_order[i] == post_order[j]) { if(j > mid) mid = j; } } } root->left = BuildTree(root->left, l, ri-1, pl, mid); root->right = BuildTree(root->right, ri+1, r, mid+1, pr-1); return root; } void layer_order(BinTree *root) { queue<BinTree*> q; vector<int> ans; if(root == nullptr) return ; q.push(root); while(!q.empty()) { BinTree *node = q.front();q.pop(); ans.push_back(node->val); if(node->left) q.push(node->left); if(node->right) q.push(node->right); } for(int i=0;i<ans.size();i++) { if(i!=0) cout << " "; cout << ans[i]; } } int main() { cin >> n; post_order.resize(n); in_order.resize(n); for(int i=0;i<n;i++) { cin >> post_order[i]; } for(int i=0;i<n;i++) { cin >> in_order[i]; } BinTree *root = nullptr; root = BuildTree(root, 0, n-1, 0, n-1); layer_order(root); return 0; } 文章来源: https://blog.csdn.net/weixin_43264529/article/details/88812180