3384. Recorrido de árbol binario

Impulsado por: NEFU AB-IN

Enlace

3384. Recorrido de árbol binario

  • significado del titulo

    Escriba un programa que lea una cadena de cadenas transversales de preorden ingresadas por el usuario y construya un árbol binario (almacenado por punteros) basado en las cadenas.
    Por ejemplo, la siguiente cadena transversal de preorden: abc##de#g##f### donde # representa un espacio y el carácter de espacio representa un árbol vacío.
    Después de establecer el árbol binario, realice un recorrido en orden en el árbol binario y emita el resultado del recorrido.

  • tren de pensamiento

    Dado **Recorrido de pedido previo + todos los nodos (incluidos los nodos vacíos)**, un árbol binario también se puede determinar de forma única
    Primero, el árbol se construye de acuerdo con el recorrido de pedido previo

    • ¡Tenga en cuenta que el árbol debe construirse con el valor del elemento como subíndice!
      Luego, cruce en orden para la salida
  • el código

    /*
    * @Author: NEFU AB-IN
    * @Date: 2023-01-30 11:32:05
    * @FilePath: \Acwing\test\test.cpp
    * @LastEditTime: 2023-04-18 19:30:13
    */
    #include <bits/stdc++.h>
    using namespace std;
    #define int long long
    #undef int
    
    #define SZ(X) ((int)(X).size())
    #define ALL(X) (X).begin(), (X).end()
    #define IOS                                                                                                            \
        ios::sync_with_stdio(false);                                                                                       \
        cin.tie(nullptr);                                                                                                  \
        cout.tie(nullptr)
    #define DEBUG(X) cout << #X << ": " << X << '\n'
    typedef pair<int, int> PII;
    
    const int N = 1e2 + 10, INF = 0x3f3f3f3f;
    
    unordered_map<char, char> l, r;
    int id;
    string s;
    
    // 根据节点的值进行建树,而不是节点的下标
    char dfs()
    {
          
          
        char rt = s[++id]; // 这句话放哪,取决于是什么遍历
        if (rt == '#' || id >= SZ(s))
            return '1';
        l[rt] = dfs();
        r[rt] = dfs();
        return rt;
    }
    
    void dfs2(char root)
    {
          
          
        if (root == '1')
            return;
        dfs2(l[root]);
        cout << root << " ";
        dfs2(r[root]);
        return;
    }
    
    signed main()
    {
          
          
        cin >> s;
        s = " " + s;
    
        char root = dfs();
        dfs2(root);
        return 0;
    }
    

Supongo que te gusta

Origin blog.csdn.net/qq_45859188/article/details/130231624
Recomendado
Clasificación