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
- El subproceso en orden adopta el marco de algoritmo de recorrido recursivo en orden
- Agregar operación de subproceso es operación de nodo de acceso
- 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.
- Si el subdominio izquierdo de la raíz del nodo transversal actual está vacío, el subdominio izquierdo apunta a pre;
- Si el subdominio derecho del pre predecesor está vacío, deje que el subdominio derecho apunte a la raíz del nodo transversal actual;
- 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;
}