1020 Tree Traversals (25)
题意
- 前序遍历:Preorder Traversal
- 中序遍历:Inorder Traversal
- 后序遍历:PostorderTraversal
- 层次遍历:level order traversal
已知中序和后序,求层次遍历
解题思路
由中序和后序来建树,因为中序的最后一个必定是根节点,只要再该根节点左右继续构建左子树和右子树就行了,构建完以后BFS得到层次遍历
Code
#include <bits/stdc++.h>
using namespace std;
struct Node
{
int val;
int left, right;
};
const int maxn = 35;
int post[maxn], //后序(左右根)
in[maxn]; //中序(左根右)
Node tree[maxn];
int cnt = 0;
int n;
int build(int l,int r,int ll,int rr)
{
int index = ++cnt;
tree[index].val = post[rr];
tree[index].left = tree[index].right = -1;
int pos = l;
while(in[pos]!=post[rr])
pos++;
if(l<=pos-1)
tree[index].left = build(l, pos - 1, ll, ll + pos - 1 - l);
if(pos+1<=r)
tree[index].right = build(pos + 1, r, rr - r + pos, rr - 1);
//cout << tree[index].val<<' ' << tree[index].left<<' '<<tree[index].right << endl;
return index;
}
void bfs()
{
queue<Node> Q;
vector<int> ans;
Q.push(tree[1]);
while(!Q.empty())
{
Node u = Q.front();
Q.pop();
//cout << u.val<<endl;
ans.push_back(u.val);
if(u.left>0)
Q.push(tree[u.left]);
if(u.right>0)
Q.push(tree[u.right]);
}
for (size_t i = 0; i < ans.size();i++)
{
if(i==0)
cout << ans[i];
else
cout << ' ' << ans[i];
}
cout << endl;
}
int main(int argc, char const *argv[])
{
//freopen("input.txt", "r", stdin);
cin >> n;
for(size_t i = 1; i <= n; i++)
cin >> post[i];
for (size_t i = 1; i <= n;i++)
cin >> in[i];
build(1, n, 1, n);
bfs();
return 0;
}