Impulsado por: NEFU AB-IN
Directorio de artículos
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
- ¡Tenga en cuenta que el árbol debe construirse con el valor del elemento como subíndice!
-
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; }