[Diario de preguntas de pincel] Verificar la serialización previa al pedido de árboles binarios

¡Continúe creando, acelere el crecimiento! Este es el quinto día de mi participación en el "Nuggets Daily New Plan · June Update Challenge", haz clic para ver los detalles del evento

El artículo 51 de este diario de cepillado se titula: Verificación de la serialización previa al pedido de árboles binarios , medio

1. Descripción del tema:

Otro problema de árbol binario, ¿qué tal un problema de árbol binario, es más simple que un árbol de múltiples bifurcaciones? En realidad, tienen la misma solución.

2. ¿Qué idea examina esta pregunta? ¿Cuál es tu pensamiento?

Los requisitos del título son relativamente claros, es decir, dar una cadena que contenga números, comas y signos de libra, que representan, respectivamente, nodos de árboles binarios, intervalos de caracteres y nodos vacíos.

Luego verificamos de alguna manera que la cadena dada es el resultado del recorrido en orden previo del árbol binario

Cuando vea este requisito, es posible que sonría. ¿Podemos simplemente restaurar la cadena a un árbol binario de acuerdo con el método transversal de preorden?

Pero el título enfatiza específicamente que no podemos reconstruir el árbol, por lo que solo podemos encontrar otra forma.

analizar

Después de pensar un poco, nuestra atención se puede cambiar a la cantidad de ciertos caracteres en la cadena, echemos un vistazo a la figura a continuación.

Para un árbol binario, un nodo puede tener 2 nodos secundarios o 1 nodo secundario, luego, según el significado del título, puede ser agregar dos números específicos en la cadena, como 2,3

o un número de nodo vacío y 1 número, por ejemplo , #,3 o 3,#

Luego, cuando atravesamos la cadena, si encontramos un signo #, entonces restamos 1 de la cantidad de nodos que se complementarán, si es un número, luego restamos 1 de la cantidad de nodos que se complementarán, y Continuar sumando 2 nodos en

Aquí no podemos confundir directamente la cantidad de nodos a complementar en la capa anterior con la cantidad de nodos a complementar en esta capa, debe separarse

De esta manera, nuestro enfoque está en los caracteres que se colocarán en la cadena dada. Recorremos desde el principio y registramos los caracteres que deben complementarse de acuerdo con la lógica anterior.

Podemos usar el método de la pila para lidiar con eso y continuar recorriendo.Si encontramos el signo #, restamos 1 del número de nodos que se complementarán (el número en la parte superior de la pila).Si es un número, luego aún restamos el número de nodos que se complementarán Restamos 1 y continuamos agregando 2 nodos a la pila

  • Durante el proceso de recorrido, si no hemos completado el recorrido de la cadena dada por la pregunta, pero los nodos a complementar ya no están disponibles, significa que la cadena dada no cumple con los requisitos.
  • Por supuesto, si recorre la cadena completa y encuentra que el número de nodos que se complementarán todavía está registrado, entonces también hay un problema, lo que indica que la cadena no es un recorrido completo de orden previo del árbol binario.
  • Por lo tanto, solo podemos determinar que la cadena es un recorrido de preorden de árbol binario completo solo cuando hemos recorrido completamente la cadena y el número de nodos que se agregarán también es 0.

3. Codificación

De acuerdo con la lógica y el análisis anteriores, podemos traducirlo al siguiente código

Cabe señalar aquí que cuando inicializamos los nodos que se complementarán, se proporciona un nodo de forma predeterminada, porque necesitamos colocar el nodo raíz y solo hay un nodo raíz.

La codificación es la siguiente:

func isValidSerialization(preorder string) bool {
    n := len(preorder)
    help := []int{1}
    // 遍历给出的 字符串
    for i := 0; i < n; {
        if len(help) == 0 {
            return false
        }
        // 校验字符串中给出的 3 中情况,数字,逗号,# 号
        if preorder[i] == ',' {
            i++
        } else if preorder[i] == '#' {
            help[len(help)-1]--
            if help[len(help)-1] == 0 {
                help = help[:len(help)-1]
            }
            i++
        } else {
            for i < n && preorder[i] != ',' {
                i++
            }
            help[len(help)-1]--
            if help[len(help)-1] == 0 {
                help = help[:len(help)-1]
            }
            help = append(help, 2)
        }
    }
    return len(help) == 0
}
复制代码

4. Resumen:

La complejidad del tiempo es muy clara, atravesamos la cadena dada una vez, por lo que la complejidad del tiempo es O(n) , y la complejidad del espacio también es O(n) , porque abrimos el espacio de la pila, este espacio involucrará cada árbol binario un nodo

Dirección del título original: 331. Verificar la serialización previa al pedido de árboles binarios

Estoy aquí hoy, lo que he aprendido, si hay alguna desviación, corríjame

Bienvenido a me gusta, seguir, favorito

Amigos, su apoyo y aliento son la motivación para que yo persista en compartir y mejorar la calidad.

Bien, aquí está esta vez.

La tecnología es abierta, y nuestra mentalidad debe ser abierta. Acepta el cambio, vive bajo el sol y sigue adelante.

Soy el pequeño demonio Nezha , bienvenido a dar me gusta, seguir y coleccionar, hasta la próxima ~

Supongo que te gusta

Origin juejin.im/post/7103925525525053471
Recomendado
Clasificación