Como “subárbol” tiene la definición más restrictiva de acuerdo con los comentarios de la pregunta, puede usar el hash para hacer esto en tiempo lineal con baja probabilidad de error. La idea es simplemente hacer hash en cada subárbol. Para hacer esto, debe ser posible calcular rápidamente el hash de un subárbol si se conocen los hash de todos los sub-subárboles. Esto se puede hacer especificando que el hash de un subárbol es HASH (CONCAT (key, left_hash, right_hash)) o algo así, donde HASH es una función hash.
Visita los nodos en postorder. Calcule el hash de cada subárbol a medida que se visita su raíz. Si el subárbol actual no es un nodo hoja, inserte el nodo en el conjunto hash. Entonces es fácil verificar si hay duplicados.
Al igual que con otros algoritmos basados en hash, la probabilidad de error disminuye exponencialmente con la longitud del valor de hash.
- ¿Cómo son útiles las estructuras de datos?
- ¿Cuál es la diferencia entre el algoritmo que venció a los humanos en el ajedrez y el algo que venció a los humanos en Go?
- ¿Por qué son importantes las pruebas para estudiar algoritmos y estructuras de datos? ¿Estudiar esas pruebas complejas es realmente necesario?
- Cómo cifrar un fragmento de texto usando un algoritmo de cifrado
- Con una base sólida en Python, ¿sería más importante aprender C o estructuras de datos y algoritmos primero?