模板:
前序和中序建树模板(数字,字符可看情况修改) C++代码 #include <bits/stdc++.h> using namespace std; using i64 = long long; #define IO ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) typedef pair<int,int> PII; const int N = 1e5+10; constexpr int mod = 1e9 + 7; i64 n,x,y,k,m; struct node { int l,r,v; }tree[N]; int build_tree(int al,int ar,int bl,int br)//由前中序,建树 { if(al > ar) return 0; int r = a[al],k = 0; while(a[al] != b[k]) k++; int len = k - bl; tree[r].v = r; tree[r].l = build_tree(al+1,al+len,bl,bl+len); tree[r].r = build_tree(al+len+1,ar,bl+len+1,br); return r; } void dfs_begin(int root)//前序遍历 { if(tree[root].v > 0) std::cout << tree[root].v << " "; else return; dfs_begin(tree[root].l); dfs_begin(tree[root].r); return ; } void dfs_center(int root)//中序遍历 { if(tree[root].l > 0) dfs_center(tree[root].l); std::cout << tree[root].v << " "; if(tree[root].r > 0) dfs_center(tree[root].r); return ; } void dfs_end(int root)//后序遍历 { if(tree[root].l > 0) dfs_end(tree[root].l); if(tree[root].r > 0) dfs_end(tree[root].r); std::cout << tree[root].v << " "; return ; } int main() { ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); cin >> n; for(int i = 0; i < n; i ++ ) cin >> b[i];//输入中序遍历 for(int i = 0; i < n; i ++ ) cin >> a[i];//输入前序遍历 build_tree(0,n-1,0,n-1);//建树 dfs(a[0]); return 0; } 后序和中序建树 #include <bits/stdc++.h> using namespace std; using i64 = long long; #define IO ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) typedef pair<int,int> PII; const int N = 1e5+10; constexpr int mod = 1e9 + 7; i64 n,x,y,k,m; int a[N],b[N]; struct node { int l,r,v; }tree[N]; int build_tree(int al,int ar,int bl,int br)//由后中序,建树 { if(al > ar) return 0; int r = a[ar],k = 0; while(a[ar] != b[k]) k++; int len = k - bl; tree[r].v = r; tree[r].l = build_tree(al,al+len-1,bl,bl+len-1); tree[r].r = build_tree(al+len,ar - 1,bl+len+1,br); return r; } void dfs(int root)//后序遍历 { queue<int> q; q.push(root); while (q.size()) { auto t = q.front(); q.pop(); cout << tree[t].v << " "; if (tree[t].l > 0) q.push(tree[t].l); if (tree[t].r > 0) q.push(tree[t].r); } } int main() { ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); cin >> n; for(int i = 0; i < n; i ++ ) cin >> a[i];//输入后序遍历 for(int i = 0; i < n; i ++ ) cin >> b[i];//输入中序遍历 build_tree(0,n-1,0,n-1);//建树 dfs(a[n - 1]); return 0; }
例题:(先序遍历+中序遍历)
假定一棵二叉树的每个结点都用一个大写字母描述。
给定这棵二叉树的前序遍历和中序遍历,求其后序遍历。
输入格式
输入包含多组测试数据。
每组数据占两行,每行包含一个大写字母构成的字符串,第一行表示二叉树的前序遍历,第二行表示二叉树的中序遍历。
输出格式
每组数据输出一行,一个字符串,表示二叉树的后序遍历。
数据范围
输入字符串的长度均不超过 2626。
输入样例:
ABC BAC FDXEAG XDEFAG
输出样例:
BCA XEDGAF
#include<bits/stdc++.h> using namespace std; const int N = 30; string s1, s2; struct node { int l, r; char c; }p[N]; void init() { for (int i = 0;i <= N;i++) { p[i].l = p[i].r = 0; p[i].c = 0; } } int built(int al, int ar, int bl, int br) { if (al > ar) { return 0; } int r = al; int k = 0; while(s1[al] != s2[k]) { k++; } int lenth = k - bl; p[r].c = s1[al]; p[r].l = built(al + 1, al + lenth, bl, bl + lenth); p[r].r = built(al + lenth + 1, ar, bl + lenth + 1, br); //cout<<p[r].c<<" "<<p[r].l<<" "<<p[r].r<<endl; return r; } void print(int x) { if (p[x].l > 0) { print(p[x].l); } if (p[x].r > 0) { print(p[x].r); } cout << p[x].c ; return; } int main() { ios::sync_with_stdio(0); cin.tie(0), cout.tie(0); while (getline(cin, s1) && getline(cin, s2)) { built(0, s1.size() - 1, 0, s2.size() - 1); print(0); cout << endl; init(); } }
例题: (后序遍历+中序遍历+层序遍历)
一个二叉树,树中每个节点的权值互不相同。
现在给出它的后序遍历和中序遍历,请你输出它的层序遍历。
输入格式
第一行包含整数 NN,表示二叉树的节点数。
第二行包含 NN 个整数,表示二叉树的后序遍历。
第三行包含 NN 个整数,表示二叉树的中序遍历。
输出格式
输出一行 NN 个整数,表示二叉树的层序遍历。
数据范围
1≤N≤301≤N≤30,
官方并未给出各节点权值的取值范围,为方便起见,在本网站范围取为 1∼N1∼N。输入样例:
7 2 3 1 5 7 6 4 1 2 3 4 5 6 7
输出样例:
4 1 6 3 5 7 2
#include<bits/stdc++.h> using namespace std; const int N=40; struct tree{ int l,r,v; }p[N]; int n; int a[N],b[N]; int built(int al,int ar,int bl,int br){ if(al>ar){ return 0; } int r=ar; int k=0; while(a[ar]!=b[k]){ k++; } int len=k-bl; p[r].v=a[ar]; p[r].l=built(al,al+len-1,bl,bl+len-1); p[r].r=built(al+len,ar-1,bl+len+1,br); return r; } void print(){ queue<int> q; q.push(n); while(q.size()){ int k=q.front(); cout<<p[k].v<<" "; q.pop(); if(p[k].l>0){ q.push(p[k].l); } if(p[k].r>0){ q.push(p[k].r); } } } int main() { ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; } for(int i=1;i<=n;i++){ cin>>b[i]; } built(1,n,1,n); print(); }