树的基础(图的遍历)

遍历即将树的所有结点访问且仅访问一次。
按照根节点位置的不同分为前序遍历,中序遍历,后序遍历。

一:前序遍历
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;
}
原文地址:https://www.cnblogs.com/nublity/p/10287778.html