Conversión mutua y recorrido entre árbol/árbol binario/bosque

Un bosque es una colección de muchos árboles, pero un bosque también puede tener un solo árbol. Un árbol binario es un árbol especial con un grado fijo de 2. Este es el resumen básico~

Hay tres métodos comunes de almacenamiento de árboles:

(1) Representación de los padres

Simplemente defina un objeto de nodo y una matriz, el código se define de la siguiente manera:

typedef struct {
    
    
	char data;
	int parent;
} Node;

typedef struct {
    
    
	Node node[100];
	int maxSize;
} NodeTree;

inserte la descripción de la imagen aquí
Ventajas: dado que el parámetro padre del elemento correspondiente almacena el subíndice del nodo padre en la matriz, es muy sencillo definir el nodo padre de un nodo hijo, por lo que es: fácil encontrar el padre Desventajas: pero si quieres para saber si un determinado padre x
tiene cuántos hijos, debe recorrer toda la matriz para ver qué padre del elemento es x, por lo tanto: es difícil encontrar los hijos

(2) Representación del niño

Para superar la dificultad de encontrar hijos, es fácil pensar en guardar los hijos de cada nodo, o es más fácil de entender mirando la definición

typedef struct {
    
    
	char data;
	int childs[];
} Node;

typedef struct {
    
    
	Node node[100];
	int maxSize;
} NodeTree;

inserte la descripción de la imagen aquí
Ventajas: Es fácil encontrar los nodos secundarios del nodo correspondiente
Desventajas: Si desea encontrar el nodo principal de un determinado nodo, imagine si debe tomar el subíndice del nodo x para facilitar todos los nodos en la matriz, consulte Ver ¿En qué matriz de nodos está el subíndice de x?
(Tenga en cuenta que la matriz de niños también se puede implementar con una lista vinculada, todas las cuales tienen el mismo significado)

Memoria: es fácil encontrar padres en representación de padres, pero difícil encontrar niños; es fácil encontrar niños en representación de niños, ¡pero difícil encontrar padres!
(3) Notación de hermano menor

Este método de almacenamiento es el más utilizado y el más conveniente, y puede realizar sin problemas la conversión de árboles, árboles binarios e incluso bosques, por lo que es muy importante.
En términos de definición de estructura, es solo la lista doblemente enlazada aprendida antes. El puntero apunta al hermano, es decir, "hijo izquierdo hermano derecho"

typedef struct Nodes{
    
    
	char data;
	Nodes child;
	Nodes sibling;
} Tree;

inserte la descripción de la imagen aquí
Este tipo de estructura de datos es muy conveniente para encontrar el hijo del padre, o encontrar el padre del hijo.Por ejemplo, si necesita encontrar el padre según el hijo, solo necesita agregar un nodo principal para apuntar hacia atrás al nodo padre (si hay un puntero de nodo padre, entonces los padres del subárbol derecho de cierto nodo deben ser todos iguales, porque los hermanos correctos, los padres de los hermanos deben ser los mismos)

typedef struct Nodes{
    
    
	char data;
	Nodes parent;
	Nodes child;
	Nodes sibling;
} Tree;

Conversión de árbol a árbol binario

La regla sigue siendo "hijo izquierdo, hermano derecho"; no importa cuántos hermanos haya, simplemente extiéndalo al subárbol derecho, como se muestra en la siguiente figura:
inserte la descripción de la imagen aquí

convertir el árbol binario de nuevo en árbol

Debido a que el nodo raíz no tiene hermanos, solo le quedan hijos, así que comience desde el nodo izquierdo del árbol binario, busque todos los hermanos derechos del nodo izquierdo y conéctelos al nodo padre del nodo izquierdo (como se muestra en la línea punteada en la figura a continuación), y luego desconecte la conexión entre los hermanos (el lugar donde se cruza la cruz), y luego continúe mirando hacia abajo desde el nodo izquierdo del primer hermano, y en el árbol que se vuelve hacia
inserte la descripción de la imagen aquí
atrás de esta manera, puede encontrar que el nodo G se puede colocar en la posición del hijo izquierdo de D, y la posición del hijo derecho también; ¡pero son el único árbol!
En ese momento, luché con esta pregunta, porque la ubicación de la izquierda y la derecha no corresponden a dos árboles diferentes.

Más tarde, volví a mirar la información y dije que si un nodo tiene un solo hijo, sin importar dónde se coloque, a la izquierda o a la derecha, es el mismo árbol,
pero las posiciones entre los dos hijos del árbol ordenado no deben ser intercambiado (por ejemplo, la posición de EF no se puede intercambiar). Si es un árbol desordenado, la posición de EF se puede intercambiar y sigue siendo el mismo árbol desordenado.

Convertir bosque en árbol binario

El llamado bosque se compone de múltiples árboles, lo cual es muy fácil de entender.
Para convertir el bosque en un árbol binario, primero use la regla del hijo izquierdo y el hermano derecho para convertir cada árbol en un árbol binario por separado, y luego use la regla del hijo izquierdo y el hermano derecho para convertir Se pueden conectar tres árboles binarios hermanos pertenecientes al mismo bosque, como se muestra en la siguiente figura:
inserte la descripción de la imagen aquí

Árbol binario convertido de nuevo a bosque

Con el ejemplo de la imagen de arriba, en realidad es muy fácil entender la conversión del árbol binario al bosque
(1) Primero desconecte los hermanos correctos del nodo raíz uno por uno, convirtiéndolos en un árbol binario independiente
(2) De acuerdo con las reglas para convertir un árbol binario en un árbol, el hijo izquierdo y el hermano derecho pueden restaurarse al árbol original.
De hecho, es el proceso de operación inversa de la imagen de arriba, por lo que no dibujaremos una nueva imagen. aquí.

atravesar

Recorrido de un árbol binario:

Recorrido en orden previo: raíz izquierda y derecha (NLR)
Recorrido en orden: raíz izquierda derecha (LNR)
Recorrido en orden posterior: raíz izquierda y derecha (LRN)
Recorrido jerárquico: comience desde el nodo raíz, escanee los nodos de arriba hacia abajo , y de izquierda a derecha Recorrido de puntos
(si se da inorder y cualquier otro orden de recorrido, se puede restaurar a un árbol binario único)

recorrido del árbol

Dado que cada nodo del árbol puede tener varios hijos, es imposible especificar el orden de recorrido de qué hijo es el primero. Solo puede especificar que el nodo padre primero o los hijos primero atraviesen la raíz primero: visite primero el nodo raíz
, y luego atraviese los hijos uno por uno. notación secundaria) Recorrido post-raíz: desde el
máximo Comenzando desde el elemento secundario en la esquina inferior izquierda, primero recorra cada nodo secundario a su vez, y finalmente visite el nodo raíz y suba capa
inserte la descripción de la imagen aquí
por capa Recorrido jerárquico: Igual que el árbol binario jerárquico atravesar, atravesar cada nodo a su vez de arriba a abajo, de izquierda a derecha

travesía del bosque

Recorrido en preorden:
Atraviese primero el nodo raíz del primer árbol,
atraviese el bosque de subárboles del nodo raíz en el primer árbol en preorden
y atraviese el segundo árbol en preorden...
En pocas palabras, es un árbol por preorden transversal eso es puede

Recorrido en orden (recorrido posterior al pedido): ¡
Recuerde que esto es un pozo! ¡El llamado recorrido en orden del bosque! De hecho, primero visita el bosque del subárbol del primer árbol y finalmente visita el nodo raíz del primer árbol,
luego continúa visitando el bosque del subárbol del segundo árbol y finalmente visita el nodo raíz del segundo árbol...
De esta manera, por analogía, hasta que se visitan todos los árboles
, de hecho, este es el último acceso al nodo raíz, por lo que también se le llama post-order traversal
(el árbol binario correspondiente generado por el bosque, el in-order traversal). del bosque o recorrido posterior al orden, debe ser el mismo que el resultado del recorrido en orden del árbol binario correspondiente!)

Esto es muy abstracto, o mira la imagen:
inserte la descripción de la imagen aquí

ejemplo:

1: Si T1 es un árbol binario convertido de un árbol ordenado T, entonces la secuencia raíz posterior de los nodos en T es la secuencia (en orden) de los nodos en T1

Debido a que T1 es un árbol binario, T1 es un árbol ordenado (un árbol ordenado significa que sus nodos izquierdo y derecho no se pueden intercambiar, está ordenado para garantizar la unicidad del árbol binario), el recorrido de raíz posterior del árbol es el recorrido de orden medio del árbol binario.
Análisis:
porque después de que el árbol se convierte en un árbol binario, el árbol binario correspondiente tiene solo el subárbol izquierdo (el nodo raíz no tiene un hermano derecho, por lo que no hay un subárbol derecho), y el recorrido de la raíz del árbol es escanear el los niños primero, y finalmente escanear al padre. Para un árbol binario con solo subárboles a la izquierda, el recorrido en orden es: izquierda, media y derecha. Dado que no hay un subárbol derecho, de hecho, solo escanea todos los elementos secundarios de la izquierda y, finalmente, escanea el padre del nodo raíz. Entonces el orden de los dos es el mismo.
También puedes hacer un dibujo para ver:
inserte la descripción de la imagen aquí

O memorizar de memoria: recorrido de la raíz posterior del árbol = recorrido en orden del árbol binario
Esto también se prueba en la prueba real de 2019.
(2) Suponiendo que el bosque F tiene 3 árboles, el número de nodos en el primer, segundo y tercer árbol son M1, M2, M3 respectivamente. El número de nodos en el subárbol derecho del nodo raíz del árbol binario correspondiente al bosque F es (M2+M3)

Esta pregunta solo necesita recordar el proceso de convertir el bosque en un árbol binario que derivamos anteriormente No es difícil imaginar que el subárbol derecho correspondiente al árbol binario es en realidad los puntos de resumen de los otros dos árboles.

(3) Sea B el árbol binario correspondiente al bosque F, que tiene m nodos, la raíz de B es p, el número de nodos en el subárbol derecho de p es n, y el número de nodos en el primer árbol del bosque F es : min

El número de puntos de resumen del bosque es m, es decir, el número de puntos de resumen del árbol binario también es m, y el número de nodos del subárbol derecho de la raíz p es n. De acuerdo con la regla del bosque al árbol binario, sabemos que el subárbol derecho del nodo raíz está compuesto por otros árboles en el bosque. Dado que el nodo del subárbol derecho n es el número total de nodos excepto el primer árbol n, entonces el primer árbol tiene mn nodos

(4) Supongamos que F es un bosque y B es un árbol binario transformado a partir de F. Si hay n nodos no terminales en F, entonces el número de campos de puntero derecho en B que están vacíos es ()

El campo del puntero derecho está vacío, es decir, no hay un hermano correcto. En el proceso de convertir el bosque en un árbol binario, el último árbol no debe tener un hermano derecho, por lo que su campo del puntero derecho debe estar vacío. En segundo lugar, cada no -nodo terminal, es decir,
debe Habrá un hijo izquierdo Después de convertir a un árbol binario, el último hijo no debe tener ningún hermano derecho, por lo que n nodos no terminales generarán n campos de puntero derecho vacíos.
inserte la descripción de la imagen aquí
Este tipo de pregunta sigue siendo para hacer un dibujo y luego ver qué opción en las coincidencias de preguntas es mejor hacer. Es difícil de entender solo con pensarlo...

(5) La secuencia en orden de un nodo de árbol binario es BDAECF, y la secuencia en orden posterior es DBEFCA, entonces el bosque correspondiente al árbol binario incluye (3) árboles

Primero, restaure el árbol binario de acuerdo con el orden interior y el orden posterior. Primero, tome el último en el orden posterior como la raíz, y la
posición de A A en el orden interno. Divida los nodos en el subárbol izquierdo BD y el subárbol derecho ECF,
y luego "centro izquierdo y derecho" según el orden posterior. Asegúrese de que D debe ser el primer nodo izquierdo visitado en el subárbol izquierdo, luego B solo puede ser su nodo padre (B no puede ser su hermano derecho, porque en este caso serán tiene un nodo principal, pero el izquierdo Solo hay dos de ellos en el subárbol, y D no es un padre, por lo que B solo puede ser el padre.
De esta manera, el subárbol izquierdo se restaura y completa.
En el subárbol derecho, ECF atraviesa la izquierda, el medio y la derecha de acuerdo con el orden. Es obvio que E es el hijo izquierdo y C es el padre. Nodo, F es el hijo derecho Si está preocupado, mírelo de acuerdo con la secuencia: EFC
, izquierda y derecha, E es el hijo izquierdo, F es el hijo derecho, C es el nodo padre
inserte la descripción de la imagen aquí

(6) [2009] Convierta el bosque en el árbol binario correspondiente. Si en el árbol binario, el nodo U es el nodo padre del nodo padre del nodo V, entonces en el bosque original, la posible relación entre U y V es:

Si V y su nodo padre están del lado derecho de U, son hermanos en el bosque original
Si V y su nodo padre están del lado izquierdo de U, entonces V y su padre son hijos de U en el bosque original. Relación de nieto
Si U todavía tiene un nodo principal en el bosque original, sin importar si V y su nodo principal están en el lado izquierdo o derecho de U, la antigüedad es menor que el nodo principal de U

(7) [2011] Se sabe que existe un árbol con 2011 nodos, y el número de nodos hoja es 116. El número de nodos sin hijos derechos en el árbol binario correspondiente a este árbol es:

inserte la descripción de la imagen aquí

(8) [2014] Convierta el bosque F en el árbol binario T correspondiente, el número de nodos hoja en F es igual a (el número de nodos cuyo puntero secundario izquierdo está vacío en T)

Debido a que T es el árbol binario correspondiente, si T no tiene hijo izquierdo, prueba que el nodo correspondiente no tiene hijo (hijo izquierdo y hermano derecho), por lo que el nodo hoja sin hijo izquierdo debe ser el nodo hoja en el bosque original F

(6) [2020] Bosque conocido F y su correspondiente árbol binario T, si la primera secuencia transversal raíz de F es a, b, c, d, e, f, la raíz transversal media es b, a, d, f, e ,c , entonces la secuencia transversal de la raíz posterior de T es:
Tenga en cuenta que el recorrido de la raíz media del bosque también es el recorrido posterior a la raíz, que se recorre uno por uno, y debe distinguirse del recorrido posterior al orden del árbol binario.

Esta pregunta solo da la raíz media y la primera raíz del bosque F, pero después de la derivación anterior, se sabe que la primera raíz y la raíz media transversal del bosque son exactamente las mismas que el preorden y el inorden del árbol binario correspondiente, por lo tanto, el árbol binario se restaura directamente de acuerdo con el orden de recorrido del bosque.
La primera a de la primera raíz debe ser el nodo raíz. El
nodo raíz a corta la raíz del medio por la mitad, porque el recorrido de la raíz del medio es "izquierda, media y derecha", entonces solo hay una b a la izquierda, y b solo debe ser el hijo izquierdo de a. La parte del subárbol derecho tiene d, f, e, c; luego, de acuerdo con el pedido previo "centro
izquierdo", la tercera posición es c, entonces c es el nodo raíz del subárbol derecho, y la posición de C en el recorrido de la raíz media será El nodo se divide en subárboles izquierdo y derecho. Se puede ver que dfe es el hijo izquierdo de c y
luego de acuerdo con el orden, la cuarta posición es d, entonces d es el nodo raíz del subárbol izquierdo de c, es decir, el hijo izquierdo de c. La posición de c en el recorrido de la raíz central divide el nodo nuevamente, y vemos que fe es el hijo derecho de d
... Esta lógica se puede empujar lentamente, y el árbol binario se puede restaurar.Finalmente, de acuerdo con el árbol binario restaurado, haga un recorrido de raíz hacia atrás.
inserte la descripción de la imagen aquí

(7) [2021] El árbol binario correspondiente a un bosque F es T. Si la secuencia de recorrido en preorden de T es a, b, d, c, e, g, f y el recorrido en orden es b, d, a, e , g, c, f, entonces el número de árboles en F es: 3

O primero restaure de acuerdo con la secuencia transversal de T, y luego vea cuántos hijos correctos tiene el nodo raíz:
inserte la descripción de la imagen aquí

Diseño de código:

(1) Programa para encontrar el número de nodos hoja en el bosque almacenados en representación hijo-hermano.
Idea de algoritmo:
en la estructura de almacenamiento en cadena en representación hijo-hermano, los que no tienen hijos deben ser nodos hoja. Solo necesitamos definir una variable global sum , y luego realice un recorrido de orden previo en el árbol binario generado por el bosque. Cuando un nodo no tiene un hijo izquierdo, sum ++; hasta que se completa el recorrido, se obtienen todos los nodos de hoja de todos los árboles en el bosque original. El pseudocódigo es el siguiente
:

int sum = 0;

findLeaves(Tree t){
    
    
	if(t==null){
    
    
		return ;
	}
	if(t.lchild == null){
    
    
		sum ++;
	} 
	findLeaves(t.lchild); // 递归找左子树
	findLeaves(t.rchild); // 递归找右子树
}

(2) Use la lista enlazada de hermanos menores como estructura de almacenamiento y diseñe un algoritmo recursivo para encontrar la profundidad del árbol.
Idea de algoritmo:
para encontrar la profundidad, aún puede atravesar en orden, defina una variable global deep y max, deep++ cada vez que recurra a la siguiente capa, y juzgue ++ si la profundidad final es mayor que la profundidad máxima de max, si es así, asigne profundidad a max, recuerde profundidad al final de la recursividad: restablezca la profundidad de la anterior capa, es mejor simplemente aumentar pero no disminuir.
El pseudocódigo es el siguiente:

int deep = 0;
int max = 0;

findDeep(Tree t, deep){
    
    
	if(t==null){
    
    
		return 0;
	}
	deep++;
	if(deep > max){
    
    
		max = deep;
	}
	findDeep(t.lchild, deep);
	findDeep(t.rchild, deep);
	deep--;
}

(3) Conociendo la secuencia jerárquica de un árbol y el grado de cada nodo, escriba un algoritmo para construir una lista enlazada de hermano hijo de este número
Idea de algoritmo:
árbol a árbol binario, hijo izquierdo hermano derecho, almacenamiento de lista enlazada, la primera capa tiene solo un nodo raíz Los puntos solo tienen hijos izquierdos, no hermanos derechos (el puntero derecho está vacío), y los nodos de segundo nivel pueden comenzar a tener hijos izquierdos y hermanos derechos (es decir, los punteros izquierdo y derecho no están vacíos) Conociendo el arreglo de secuencia jerárquica y el grado de cada
nodo Array, primero cree un nodo raíz T, defina una estructura similar a una lista doblemente enlazada, inserte el primer elemento A de la secuencia jerárquica en el nodo raíz T (el nodo raíz tiene no hermanos), y luego convertir su nodo izquierdo en un nivel. En este momento, el segundo elemento B de la secuencia
busca el grado del primer elemento A de la matriz de grados del nodo (es decir, cuántos hijos tendrá), pone el grado -1 (menos B), y coloca el bucle for en B Lista enlazada de campos punteros a la derecha (el hijo de A es el hermano de B, por lo que se deletrea a la derecha); cada vez que se deletrea uno, un elemento se toma de la matriz transversal jerárquica y se coloca en un nuevo nodo, para simular la eliminación de la cola.
Luego encuentre el grado de B de la matriz de grados y haga un bucle para generar el hijo izquierdo para él. El núcleo del enlace de la izquierda
inserte la descripción de la imagen aquí
es recorrer cada elemento de la matriz atravesada jerárquicamente para ver el grado del elemento (el grado en el árbol original, representa cuántos hijos tiene), y también preste atención al valor del grado -1 del nodo padre de la capa superior, y el primer hijo de la siguiente capa tiene que ciclar cuántos hermanos tiene. tiene a su nodo derecho.

Supongo que te gusta

Origin blog.csdn.net/whiteBearClimb/article/details/127919708
Recomendado
Clasificación