En un montón binario, un nodo con índice i tiene hijos en los índices 2i + 1 y 2i + 2 (cuando la matriz es 0 indexada). ¿Cómo se deriva esta relación?

Probablemente haya una manera más fácil, pero al menos lo siguiente funciona.

Representemos los nodos mediante una combinación de su profundidad y su índice a esa profundidad. Supongamos que comienza en el nodo [math] i [/ math], que es el nodo [math] j [/ math] (indexado a cero) en profundidad [math] d [/ math]. Deseamos encontrar el índice [math] i ‘[/ math] del niño izquierdo.

Primero, calcule cuántos nodos hay a cierta profundidad. Eso es fácil: [matemáticas] 2 ^ d [/ matemáticas]. Entonces, el número de nodos hasta (pero sin incluir) profundidad [matemática] d [/ matemática] es [matemática] 1 + 2 + 4 + \ ldots + 2 ^ {d-1} = 2 ^ d-1 [/ matemática ] De eso obtenemos la relación entre un índice [matemática] i [/ matemática] y su representación [matemática] (d, j) [/ matemática]: sabemos que [matemática] i (d, j) = 2 ^ d- 1 + j [/ matemáticas].

Ahora regrese al nodo [math] i [/ math] que nos interesa. Hay nodos [math] j [/ math] en profundidad [math] d [/ math] cuyos hijos aparecerán antes que los de [math] yo [/ matemáticas]. Por lo tanto, el elemento secundario izquierdo del nodo [matemática] i [/ matemática] será el número de nodo [matemática] 2j [/ matemática] en profundidad [matemática] d + 1 [/ matemática].

Descubrimos antes cómo podríamos calcular el índice de un nodo dado a una profundidad dada. Al conectar [matemáticas] d + 1 [/ matemáticas] y [matemáticas] 2j [/ matemáticas] obtenemos

[matemáticas] i ‘= i (d + 1,2j) = 2 ^ {d + 1} -1 + 2j = 2 (2 ^ d-1 + j) +1 = 2i (d, j) +1 = 2i +1 [/ matemáticas].

Cada nivel de árbol binario completo tiene 2 ^ (nivel) nodos. Por lo tanto, los hijos del nodo actual siempre estarán en el desplazamiento de 2 ^ (nivel) nodos lejos del nodo actual.

La implementación de almacenamiento dinámico binario con una matriz utiliza la misma propiedad para ubicar el índice secundario o primario dentro de la matriz. Espero que esto ayude.

¡Feliz codificación! 🙂

More Interesting

¿Encontrar el número máximo de reinas que puedes colocar en un tablero de ajedrez modificado con paredes negras? Por favor, discuta el enfoque del algoritmo, la implementación y la complejidad en detalles.

Dos jugadores juegan el siguiente juego: hay N piedras en la mesa, el jugador puede tomar 1 o 2 piedras (si N mod 3 = 0), 1 o 3 (si N mod 3 = 1) y 1, 2 o 3 ( si N mod 3 = 2). ¿Cómo determino al ganador en el juego?

Dado un gráfico dirigido, ¿podemos hacer DFS en cada nodo para encontrar el nodo de mayor valor?

Cómo ordenar diagonales de una matriz 2D de manera eficiente

¿Es necesario codificar todos los datos en estructuras como pilas en C ++, o es un conocimiento práctico suficiente para aclarar entrevistas?

¿Por qué a la mayoría de la gente le cuesta resolver problemas de algoritmos?

En el algoritmo O (n) para encontrar el elemento máximo en una matriz, ¿cuál es el valor esperado del número total de cambios en el valor de una variable que mantiene el máximo sobre el paso de una matriz?

¿Qué tan difícil es la entrevista de Google? ¿Qué tipo de algoritmos y preguntas de ingenio espero?

¿Cuáles son algunas de las mejores plataformas en línea para practicar la codificación relacionada con algoritmos?

Cómo comparar dos algoritmos de recomendación en términos de problema de cola larga

¿Hay alguna manera / hay algoritmos para dividir los caracteres chinos en radicales?

Cómo hacer que el código de una ordenación de inserción sea más optimizado utilizando una lista vinculada

¿Cómo puede alguien con un doctorado en física trabajar en el desarrollo de algoritmos?

¿Cuál es el mejor algoritmo para girar a la izquierda en los semáforos?

Como senior que busca postularse a empresas como Google, Palantir, etc., ¿cómo puedo mejorar mis estructuras de datos avanzadas, algoritmos y cursos de bioinformática y tener más confianza en mí mismo al ingresar a un aula y no pensar automáticamente que soy estúpido? ?