Estructura de datos: el concepto de árbol, el concepto de árbol binario

introducción

Ahora son las 15:28 del 7 de junio de 2023, hora de Beijing. Acabo de terminar el examen final de una clase y voy a publicar este blog inmediatamente después de regresar al dormitorio. Todavía faltan dos blogs para completar los indicadores de revisión de esta semana. ¡vamos!

1. El concepto de árbol

Un árbol es una estructura de datos no lineal, que es un conjunto de relaciones jerárquicas compuesto por n (n>=0) nodos finitos. Se llama árbol porque parece un árbol al revés, lo que significa que tiene las raíces hacia arriba y las hojas hacia abajo. Un árbol se puede dividir aproximadamente en dos partes, la raíz y el subárbol. El nodo raíz es el nodo más especial del árbol, no tiene nodos predecesores. Excepto el nodo raíz, los otros nodos se dividen en M (M>0) conjuntos disjuntos T1, T2, ..., Tm, cada conjunto Ti (1<= i<= m) es una estructura y subárboles en forma de árbol. El nodo raíz de cada subárbol tiene un único predecesor y puede tener cero o más sucesores. Por lo tanto, los árboles se pueden definir recursivamente.

inserte la descripción de la imagen aquí
Nota: No puede haber intersección entre subárboles, de lo contrario no será una estructura de árbol, sino una estructura de gráfico.
inserte la descripción de la imagen aquí

1.1 Otros conceptos relacionados con los árboles

inserte la descripción de la imagen aquí

Grado de un nodo: el número de subárboles contenidos en un nodo se denomina grado del nodo; como se muestra en la figura anterior: A es un
nodo de 6 hojas o nodo terminal: un nodo con grado 0 se denomina hoja nodo; como se muestra en la figura anterior: B, C, Nodos como H, I... son nodos hoja,
nodos no terminales o nodos de rama: nodos cuyo grado no es 0; como se muestra en la figura anterior: nodos tales como D, E, F, G... son nodos de rama
Nodos padres o nodos padres (importante): si uno Si un nodo contiene nodos hijos, este nodo se denomina nodo padre de sus nodos hijos, como se muestra en la figura anterior : A es el nodo padre de B Nodo hijo
o nodo hijo (importante): el nodo raíz del subárbol contenido en un nodo se llama nodo hijo del nodo Nodos; Como se muestra en la figura anterior: B es el nodo hijo de A.
Nodos hermanos: los nodos con el mismo nodo padre se denominan nodos hermanos , es el grado del árbol, como se muestra en la figura anterior: el grado del árbol es 6. El árbol binario que suele escuchar es el nivel de los nodos del árbol con un grado de 2: a partir de la definición de la raíz, la raíz es el primer nivel, los nodos secundarios de la raíz son el segundo nivel, y así sucesivamente ; altura o profundidad del árbol (importante): El nivel máximo de nodos en el árbol; como se muestra en la figura anterior: la altura del árbol es de 4 nodos primos: los nodos cuyos padres están en el mismo nivel son primos; como se muestra en la figura de arriba: H e I son ancestros de nodos hermanos (comprensión): desde la raíz hasta Todos los nodos en la rama por la que pasa el nodo; como se muestra en la figura de arriba: A es el ancestro y descendiente de todos los nodos ( conocimiento): cualquier nodo en el subárbol con raíz en un nodo determinado se denomina descendiente del nodo. Como se muestra arriba: todos los nodos son descendientes de un bosque:






Una colección de m (m>0) árboles disjuntos se denomina bosque; por ejemplo, la estructura de datos de búsqueda de unión se compone de bosques.

2. La estructura de la implementación del código del árbol.

El concepto básico del árbol se introdujo anteriormente, veamos cómo implementar el árbol con código.

//这样结构定义树可以吗?
struct TreeNode
{
    
    
	struct TreeNode* child1;
	struct TreeNode* child2;
	struct TreeNode* child3;
	//...
	int data;
};

La respuesta es no, porque no utiliza el grado del árbol para estipular claramente cuántos niños se deben definir como máximo. Así que esta estructura es incorrecta. A continuación les muestro una estructura. Suponga que el grado del árbol es N y vea el siguiente código.

#define N 5
//假设N为5
struct TreeNode
{
    
    
	struct TreeNode* ChildrenArr[N];
	int data;
};

Lo siguiente introduce una estructura de representación muy poderosa, la representación del hermano izquierdo y el hijo derecho. Es decir, el nodo del árbol tiene solo dos punteros, que apuntan al primer hijo y al siguiente nodo hermano, respectivamente. Esta representación puede construir todas las estructuras de árbol.
inserte la descripción de la imagen aquí


typedef int DataType;
struct TreeNode
{
    
    
	struct TreeNode* _firstChild1; // 第一个孩子结点
	struct TreeNode* _pNextBrother; // 指向其下一个兄弟结点
	DataType _data; // 结点中的数据域
};

Este método de representación puede ahorrar espacio de almacenamiento y también mejora la eficiencia transversal de la estructura de árbol, porque el hijo izquierdo y el hermano derecho de cada nodo se pueden ubicar directamente.

2.1 Aplicación de la estructura de árbol

Por lo general, la estructura de archivos del disco del sistema operativo es una estructura de árbol clásica. Aquí tomo el sistema Linux como ejemplo.
inserte la descripción de la imagen aquí
¿Por qué utilizar una estructura de árbol como sistema de archivos de disco?La estructura de archivos de disco del sistema Linux adopta una estructura de árbol, que proporciona a los usuarios un método de gestión de archivos claro, simple, conveniente y eficiente.

3. El concepto de árbol binario

Un árbol binario es en realidad un árbol de grado dos. Suelen darse las siguientes situaciones.
inserte la descripción de la imagen aquí

En un árbol binario, siempre hay un nodo más con grado 0 que con grado 2. A continuación, citaré brevemente dos escenarios simples para verificar esta conclusión.
inserte la descripción de la imagen aquí

3.1 El concepto de un árbol binario especial

3.1.1 Árbol binario completo

Para un árbol binario con una profundidad de k, si todos sus nodos están en las capas primera a k-ésima, y ​​todos los nodos hoja están en la capa k-ésima o en la capa k-1 y el orden de la capa k-ésima debe ser continuo de izquierda a derecha , entonces este árbol binario es un árbol binario completo. Un árbol binario completo es un tipo especial de árbol binario completo.
inserte la descripción de la imagen aquí
Entonces, ¿cómo encontrar el rango del número de nodos para un árbol binario completo con una altura de h?
inserte la descripción de la imagen aquí
De la misma manera, se puede inferir que el rango de altura del árbol binario completo es el logaritmo de (Sn) + 1 o el logaritmo de (Sn+1) con base 2.

3.1.2 Árbol binario completo

Un árbol binario es un árbol binario completo si el número de nodos en cada capa alcanza el valor máximo. Es
decir, si el número de capas de un árbol binario es h, y el número total de nodos es 2 elevado a h-1, entonces es un árbol binario completo.
inserte la descripción de la imagen aquí
¿Por qué el número total de nodos en un árbol binario completo es 2 a la potencia h -1? Veamos mi análisis a continuación.
inserte la descripción de la imagen aquí
Se puede ver que el punto de resumen de un árbol binario completo es una fórmula de diferencia aritmética Por supuesto, la conclusión es que el número de puntos de resumen de un árbol binario completo es 2 elevado a la h -1. De la misma manera, la altura del árbol binario completo es igual al logaritmo de h = log (Sn+1) basado en dos.

3.2 Explicación de las preguntas de la prueba del árbol binario

3.2.1 Pregunta 1

inserte la descripción de la imagen aquí
Esta pregunta evalúa principalmente la comprensión de las propiedades básicas de los árboles binarios, es decir, el número de nodos con grado 0 en un árbol binario es siempre uno más que el número de nodos con grado 2. Elija B para esta pregunta .

3.2.2 Pregunta 2

inserte la descripción de la imagen aquí
De hecho, la clave de esta pregunta es un árbol binario completo. Aquí, según el árbol binario completo de grado 1, sólo puede haber 1 o 0 nodos, y según esta condición, el árbol binario de grado 0 siempre tendrá un nodo más que un nodo de grado 0. 2. Se puede inferir que existe 1 nodo con grado 1, es decir, el nodo hoja n0=2n/2=n. Elija A para esta pregunta.
inserte la descripción de la imagen aquí

3.2.3 Pregunta 3

inserte la descripción de la imagen aquí
Esta pregunta aún está poniendo a prueba la comprensión del concepto de un árbol binario completo. Antes que nada, necesitamos saber que los nodos del árbol binario completo son: Sn=n0+n0-1+n1. Según Sn=767, y dado que n0 y n1 deben ser números enteros, entonces n1 = 0. Entonces 2n0 = 768, n0 es igual a 384. Elija B para esta pregunta.

4. Estructura de almacenamiento del árbol binario

La estructura de almacenamiento del árbol binario se divide en dos tipos, el árbol binario de estructura de cadena y el árbol binario de estructura de secuencia. Su implementación subyacente corresponde a una lista enlazada y una lista secuencial.

4.1 Almacenamiento de estructura secuencial

El árbol binario de estructura secuencial en realidad usa matrices para administrar datos. En general, solo es adecuado para árboles binarios completos, porque los árboles binarios no completos desperdiciarán espacio. En realidad, solo el montón usará arreglos para el almacenamiento. Explicaré el montón más adelante. El almacenamiento secuencial de árbol binario es físicamente una matriz y lógicamente un árbol binario.
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
El uso de matrices para almacenar árboles binarios tiene limitaciones, ya que solo es adecuado para el almacenamiento de árboles binarios completos.

4.2 Estructura de cadena de almacenamiento

La estructura de almacenamiento enlazada del árbol binario significa que se utiliza una lista enlazada para representar un árbol binario, es decir, se utiliza un enlace para indicar la relación lógica de los elementos. El método habitual es que cada nodo en la lista enlazada se compone de tres campos, el campo de datos y los campos de puntero izquierdo y derecho, y los punteros izquierdo y derecho se utilizan para dar las direcciones de almacenamiento de los puntos de enlace donde el hijo izquierdo y hijo derecho del nodo se encuentran. La estructura de la cadena se divide en cadena binaria y cadena triple. El estudio actual es la cadena binaria, y el famoso árbol rojo-negro usa la cadena triple.

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/m0_71927622/article/details/131053526
Recomendado
Clasificación