[Estructura de datos]——La cola implementa la función del árbol binario

Prefacio: Hay muchas formas de implementar árboles binarios. Hay matrices para implementar árboles binarios completos y listas vinculadas para implementar árboles binarios completos. Hoy usaremos colas para implementar árboles binarios.

Insertar descripción de la imagen aquí

Crea un árbol binario:

typedef int BTDataType;
typedef struct BinaryTreeNode
{
    
    
	BTDataType data;
	struct BinaryTreeNode* left;
	struct BinaryTreeNode* right;
}TreeNode;

Recorrido del orden de las capas:

void LevelOrder(TreeNode* root)
{
    
    
	Queue q;
	QueueInit(&q);
	if (root)
		QueuePush(&q, root);

	int levelSize = 1;
	while (!QueueEmpty(&q))
	{
    
    
		// 一层一层出
		while (levelSize--)
		{
    
    
			TreeNode* front = QueueFront(&q);
			QueuePop(&q);

			printf("%d ", front->data);

			if (front->left)
				QueuePush(&q, front->left);

			if (front->right)
				QueuePush(&q, front->right);
		}
		printf("\n");

		levelSize = QueueSize(&q);
	}
	printf("\n");

	QueueDestroy(&q);
}

Nuestra cola se usa para almacenar nodos de árbol binario, por lo que nuestro propósito es atravesar los nodos capa por capa, por lo que nuestra primera capa es el nodo raíz, lo colocamos en la cola y lo retiramos de la cola. Necesita traer sus nodos del subárbol izquierdo y del subárbol derecho a la cola, entonces, ¿cómo sabemos el número de nodos en cada capa? Definimos un nivel de tamaño con un valor inicial de 1.
Insertar descripción de la imagen aquí
Nuestro tamaño de nivel es el número de nodos en cada capa. Debido a que el número de nuestros nodos está en la cola, nuestro número es igual al número de datos en la cola, es decir, , logramos nuestro objetivo sacando los nodos de la cola e imprimiéndolos capa por capa. El proceso completo se muestra a continuación:levelSize = QueueSize(&q)
Insertar descripción de la imagen aquí

Determine si un árbol binario es un árbol binario completo:

bool TreeComplete(TreeNode* root)
{
    
    
	Queue q;
	QueueInit(&q);
	if (root)
		QueuePush(&q, root);

	int levelSize = 1;
	while (!QueueEmpty(&q))
	{
    
    
		TreeNode* front = QueueFront(&q);
		QueuePop(&q);

		if (front == NULL)
			break;

		QueuePush(&q, front->left);
		QueuePush(&q, front->right);
	}

	// 前面遇到空以后,后面还有非空就不是完全二叉树
	while (!QueueEmpty(&q))
	{
    
    
		TreeNode* front = QueueFront(&q);
		QueuePop(&q);

		if (front)
		{
    
    
			QueueDestroy(&q);
			return false;
		}
	}

	QueueDestroy(&q);
	return true;
}

Aquí también ponemos en cola y sacamos de la cola los nodos en el orden de ellos. Nuestro nivel de tamaño controla los datos de cada capa. Cuando nuestro nodo raíz es sacado de la cola, su subárbol izquierdo y su subárbol derecho se llevan a la cola. El subárbol en el medio está vacío, luego salimos del ciclo, pero si luego tenemos nodos no vacíos, es decir, son discontinuos, entonces no es un árbol binario completo.
Insertar descripción de la imagen aquí
Después de obtener el subárbol izquierdo 3 de 2, salimos de la cola y luego obtenemos el subárbol derecho de 2. El subárbol derecho de 2 está vacío, por lo que finalizamos el ciclo y Obtenemos la cola de la cola. Luego, el primer elemento se saca de la cola. Si los elementos de la cola no están vacíos, significa que el árbol binario no es continuo, por lo que el árbol no es un árbol binario completo. De lo contrario, , es un árbol binario completo.

Si ayuda a alguien, ¡por favor apóyelo! ¡gracias por su apoyo!

Supongo que te gusta

Origin blog.csdn.net/Lehjy/article/details/134887715
Recomendado
Clasificación