Un árbol binario de pistas que los principiantes pueden entender de un vistazo: estructura de datos árbol binario de pistas

1. Razones para usar pistas

La lista enlazada binaria se usa como una estructura de almacenamiento para encontrar el predecesor directo y el sucesor directo del nodo de manera conveniente y rápida . Este método de acceso dinámico consiste en hacer un uso completo del dominio de la cadena vacía en la lista binaria vinculada para guardar la información del predecesor y sucesor del nodo en el proceso transversal.

2. La estructura del nodo del árbol binario de pistas

Una lista enlazada binaria con n nodos tiene 2n dominios de cadena; dominios de cadena vacía: n + 1; dominios de cadena no vacíos: n-1 (la línea que conecta los dos puntos);

Comprender el concepto de pistas.

Según el orden transversal diferente, se divide en: árbol binario de pistas de preorden, árbol binario de pistas de orden medio, árbol binario de pistas de posorden

3. Ideas algorítmicas

  1. El subproceso en orden adopta el marco de algoritmo de recorrido recursivo en orden
  2. Agregar operación de subproceso es operación de nodo de acceso
  3. La operación de agregar hilo necesita usar la relación entre el nodo que acaba de visitar y el nodo actual, así que configure un puntero antes para registrar siempre el nodo que acaba de visitar.
    1. Si el subdominio izquierdo de la raíz del nodo transversal actual está vacío, el subdominio izquierdo apunta a pre;
    2. Si el subdominio derecho del pre predecesor está vacío, deje que el subdominio derecho apunte a la raíz del nodo transversal actual;
    3. Para prepararse para la próxima vez, la raíz del nodo de acceso actual sirve como predecesora del siguiente nodo de acceso;

4. Construye un árbol binario de pistas de orden medio.

Algoritmo central

 5. Código completo

#include <stdio.h>
#include <stdlib.h>

typedef struct BiNode
{
	char data;
	int Ltag;
	int Rtag;
	struct BiNode * LChild;
	struct BiNode * RChild;
}BiNode,*BiTree;

BiTree pre;	//全局定义前驱指针

//创建二叉树,按先序遍历输入
void CreateBiTree(BiTree *T)
{
	char ch;
	scanf("%c",&ch);
	if(ch=='#')
        *T=NULL;
	else{
		*T=(BiTree) malloc (sizeof(BiNode));
		(*T)->data=ch;
		CreateBiTree(&(*T)->LChild);
		CreateBiTree(&(*T)->RChild);	
	}
}

//中序线索化
void Inthread (BiTree root)
{
	if (root !=NULL )
	{
		Inthread(root->LChild);//线索化左子树
		printf(" %c ",root->data);
		if (root->LChild==NULL)	//找前驱
		{
			root->Ltag=1;
			root->LChild=pre;	
		}
		if (pre !=NULL && pre->RChild == NULL) //找后继
		{
			pre->RChild=root;
			pre->Rtag=1;
		}
		pre=root;	//让当前结点作为下一次的前驱
		Inthread(root->RChild);//线索化右子树
	}
}

int main()
{
	BiTree T;
	printf("请按照先序遍历的方式输入(为空是输入#): ");
	CreateBiTree(&T);
	printf("中序线索化: ");
	Inthread(T);
	printf("\n");
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_44068262/article/details/106429603
Recomendado
Clasificación