遍历即将树的所有结点访问且仅访问一次。
按照根节点位置的不同分为前序遍历,中序遍历,后序遍历。
一:前序遍历
1. 访问根结点;
2. 遍历左子树;
3. 遍历右子树。
二:中序遍历
1. 遍历左子树;
2. 访问根结点;
3. 遍历右子树。
三:后续遍历
1. 遍历左子树;
2. 遍历右子树;
3. 访问根结点。
求下图的三种遍历
前序遍历:A B C D E F
中序遍历:B C A E D F
后序遍历:B C D E F A
已知前序和中序遍历,求后序遍历:
#include <bits/stdc++.h> #define ll long long #define ull unsigned long long #define inf 0x3f3f3f3f #define met(a, x) memset(a,x,sizeof(a)) #define mp make_pair using namespace std; const int N = 1e5 + 10; const int mod = 1e9 + 7; /*DBACEGF ABCDEFG ACBFGED*/ using namespace std; string in,pre; void dfs(string p,string i){//p为先序遍历,i为中序遍历。 if(i.size()<=0) return;//判断是否还有字符。 int root; for(int j=0;j<i.size();j++){ if(i[j]==p[0]){ root=j; } } dfs(p.substr(1,root),i.substr(0,root));//左子树第一个为根,要从位置“1”开始取。 dfs(p.substr(root+1),i.substr(root+1));//取出从root+1这个位置开始往后所有字符。 cout<<p[0];//输出根。 } int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); while(cin>>pre>>in){ dfs(pre,in); cout<<endl; } return 0; }
已知中序和后序遍历,求前序遍历
#include<bits/stdc++.h> #define ll long long #define inf 0x3f3f3f3f #define met(a, x) memset(a,x,sizeof(a)) using namespace std; const int N = 1e6 + 10; void dfs(string in, string after) { if (in.size() <= 0) return; char ch = after[after.size() - 1]; cout << ch; int k = in.find(ch); dfs(in.substr(0, k), after.substr(0, k)); dfs(in.substr(k + 1), after.substr(k, in.size() - k - 1)); } int main() { ios::sync_with_stdio(false); cin.tie(0); string in, af; cin >> in >> af; dfs(in, af); cout << endl; return 0; }