zoukankan      html  css  js  c++  java
  • 树的基础(图的遍历)

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

    一:前序遍历
    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;
    }
  • 相关阅读:
    币圈惊现门罗币挖矿新家族「罗生门」
    5步告诉你QQ音乐的完美音质是怎么来的,播放器的秘密都在这里
    【云+社区极客说】新一代大数据技术:构建PB级云端数仓实践
    Android P的APP适配总结,让你快人一步
    C++11用于计算函数对象返回类型的统一方法
    C++11用于元编程的类别属性
    C++11多态函数对象包装器
    C++11包装引用
    C++11能用智能指针
    C++正则表达式
  • 原文地址:https://www.cnblogs.com/nublity/p/10287778.html
Copyright © 2011-2022 走看看