Maestro, por favor programe
//Incluye la definición de la estructura del árbol binario, la creación del árbol binario, el algoritmo transversal (recursivo y no recursivo),
/* p>
Autor: /archiver/tid-787995.html
Tiempo:
Contenido: Complete la creación del árbol binario, recorra el orden frontal, medio y posterior de el árbol binario (recursivamente)
Tiempo:
Contenido:
Tiempo:
Contenido: Búsqueda completa estática y dinámica de árboles binarios (no recursivo)
*/
#Contiene " stdlib.h "
#Definir el nodo máximo 20
#Definir ISIZE 8
#Define NSIZE0 7
#define NSIZE1 8
#Define NSIZE2 15
//SHOWCHAR = 1 (mostrar caracteres )SHOWCHAR = 0 (mostrar números)
# Definir SHOWCHAR 1
//Estructura de árbol binario
Estructura BTNode
{ p>
int data;
BTNode * rchild
BTNode * lchild
};
//Binario no recursivo árbol a través de pila
Base estructural
{
BTNode * ptree
ABTStack * link
};
char TreeNodeS[NSIZE0] = {'A ',' B ', ' C ', ' D ', ' E ', ' F ', ' G ' };
char PreNodo[NSIZE0] = {'A', 'B', 'D', 'E', 'C', 'F', 'G' };
char MidNode[NSIZE0] = {'D', 'B', 'E', 'A', 'C', 'G', 'F' };
int treenode n 0[nsize 1][2]= { { 0, 0}, {1, 1}, {2, 2}, {3, 3}, {4, 4}, {5, 5}, {6, 6}, {7, 7 } }; /p>
int treenode n 1[nsize 1][2]= { { 0, 0}, {4, 1}, {2, 2}, {6, 3}, {1, 4}, { 3, 5}, {5, 6}, {7, 7 } }; p>
int treenode 0[nsize 1][2]= { { ' 0 ', 0}, {'D ', 1}, {'B', 2}, {'F', 3}, {'A', 4}, {'C', 5}, {'E', 6}, {'G', 7} };
int treenode 1[nsize 1][2]= {{'0',0},{'A',1},{'B',2},{'C', 3},{'D',4},{'E',5},{ 'F ', 6}, {'G ', 7 } }
int TreeNode2[NSIZE2][2] ] = {{'0', 0}, {'A', 1}, {'B', 2}, {'C', 3}, {'D', 4}, {'E', 5} , {'F ', 6}, {'G ', 7}, {'H ', 8}, {'I ', 9}, {'J ', 10}, {'K ', 11}, { 'L
int insertar nodo[ISIZE]
= {-10, -8, -5, -1, 0, 12, 14, 16};
//char * prestr = "abde CFG";
// char * midder = " DBEACGF ";
/*
Función de creación de árbol binario dcreatbranchtree 1();
Descripción del parámetro:
Int array[]: matriz de campos de datos del nodo del árbol binario
Int i: el número de serie del nodo actual.
Int n: el número de nodos del árbol binario.
Valor de retorno:
dcreatebranctree 1 = el puntero del nodo raíz del nuevo árbol binario.
Observaciones:
Nodo raíz = matriz [(I j)/2];
Nodo hijo izquierdo = [matriz [I], matriz [(I J) ) ) 2-1]]
Nodo secundario derecho = [matriz [(I j)/2 1, matriz [j]]
*/
BTNode * dcreatebranctree 1(char array[], int i, int n)
{
Nodo Bt * p /*Nodo de árbol binario*/
If (i gt=n)
Retorno (NULL);
p =(Nodo Bt *)malloc(tamañode(nodo Bt));
p -> ; datos = matriz[I];
p->; l niño = dcreatebranctree 1(matriz, 2*i 1, n
p->; dcreatebranctree 1 (matriz, 2*i 2, n);
Retorno (p);
}
/*
Binario; función de creación de árbol dcreatebranchtree 2();
Descripción del parámetro:
Int array[]: matriz de campos de datos de nodo de árbol binario
Int i: el número de serie de el nodo actual.
Int n: el número de nodos del árbol binario.
Valor de retorno:
DCreateBranchTree2 = El puntero del nodo raíz del nuevo árbol binario.
Observaciones:
Nodo raíz = matriz [(I j)/2];
Nodo hijo izquierdo = [matriz [I], matriz [(I J) ) ) 2-1]]
Nodo secundario derecho = [matriz [(I j)/2 1, matriz [j]]
*/
Nodo Bt * dcreatebranctree 2(char array[], int i, int j)
{
Nodo Bt * p /*Nodo de árbol binario*/
If (i gtj)
Retorno (NULL);
p =(Nodo Bt *)malloc(tamañode(nodo Bt));
p- >; datos = matriz[(I j)/2];
p->; l niño = dcreatebranctree 2(matriz, I, (I j)/2-1);
p->; rchild = dcreatebranctree 2(array, (i j)/2 1, j
Return (p); /*
Función de creación de árbol binario dcreatebranchtree 3():
Se conocen las cadenas de secuencia transversal de preorden y orden del árbol binario y se construye el árbol binario correspondiente. .
ltProgramming Idea>:
Primero, el primer elemento en la secuencia transversal de preorden es el nodo raíz del árbol binario, y luego
, en la secuencia secuencia transversal Si este nodo se encuentra en, entonces el nodo anterior a este nodo debe ser
Su nodo secundario izquierdo debe ser su nodo secundario derecho en el futuro;
Luego, en el intermedio secuencia transversal secuencial, el subárbol izquierdo y el subárbol derecho del nodo raíz son respectivamente
El nodo raíz del subárbol está determinado por el primer carácter de la secuencia transversal correspondiente al antecedente del subárbol, y luego el nodo raíz está determinado por el orden intermedio
La posición del nodo raíz en la secuencia transversal determina su subárbol izquierdo y subárbol derecho respectivamente.
Los nodos;
Por analogía, determine todos los nodos del árbol binario y construya el árbol binario.
Descripción del parámetro:
Char *pre: secuencia transversal de preorden
Char *mid: secuencia transversal de orden medio
Int n: El número de nodos en la secuencia transversal.
Valor de retorno:
DCreateBranchTree3 = El puntero del nodo raíz del nuevo árbol binario.
*/
BTNode * dcreatebranctree 3(char * pre, char *mid, int n)
{
Nodo Bt * p;
char * t;
int left
Si (n lt=0)
Return (NULL); p> p>
p =(nodo Bt *)malloc(sizeof(nodo Bt));
p->; datos = * pre
for(t = mid ; t ltmid n; t )
if(* t = = * pre)break;/*Encontrar el nodo raíz en la secuencia transversal de orden medio*/
Izquierda = t- mid;/ *El número de nodos en el subárbol izquierdo*/
p->; l child = dcreatebranctree 3(pre 1, t, left); rchild = dcreatebranctree 3 (pre 1 izquierda, t 1, n-1-izquierda
Retorno (p>
}
/*); p>
Función de creación de árbol binario createbranchtree():
Descripción del parámetro:
Int array[]: matriz de campos de datos de nodo de árbol binario
Int n : el número de nodos del árbol binario.
Valor de retorno:
CreateBranchTree = el puntero del nodo raíz del nuevo árbol binario.
*/
Nodo Bt * crear árbol de ramas(int array[][2], int n)
{
BTNode *head, *p;
Bt node *node addr[MAXNODE]; //Búfer temporal de dirección de nodo
int i, norder, rorder
head = NULL
Printf("Datos originales del árbol binario: \t ");
for(I = 1; i lt= n; i)
{
p =(nodo Bt *)malloc(tamañode(nodo Bt));
if(p==NULL)
{
printf("\n¡Desbordamiento de memoria al crear un nuevo nodo!\n ");
Retorno (NULL);
}
Otros
{
p->; datos = matriz[I][0];
p->; l niño = p- rchild = NULL
norder = matriz[I][1];
dirección de nodo[norder]= p;
if(norder gt; 1)
{
ror der = norder/2; /*Nodo no raíz: vinculado a su propio nodo padre*/
if(norder 2 == 0)
dirección de nodo[ror der]- gt;l child = p;
Otro
dirección de nodo[ror der]- gt;rchild = p;
}
Otros
head = p; /*Nodo raíz*/
if(SHOWCHAR)
printf("c ", p - gt; datos);
Otro
printf("d ", p- gt; datos);
}
}
Return (head);
}
// - Parte recursiva.
/*
Función transversal de pedido anticipado de árbol binario dpre _ order _ access();
Descripción del parámetro:
BTNode * head: puntero al nodo raíz del árbol binario.
*/
void dpre _ Order _ Access(Bt node * head)
{
if (head!=null)
{
if(SHOWCHAR)
printf("c", head- gt; data
Otros
printf("d ",head- gt; data);
dpre _ Order _ Access(head- gt; l child /* Recorre recursivamente el subárbol izquierdo*/ p); >
dpre _ Order _ Access(head- gt; rchild);/*Atraviesa recursivamente el subárbol de la derecha*/
}
}
/*
Función transversal ordenada dmid _ order _ access() en un árbol binario
Descripción del parámetro:
BTNode *head: el nodo raíz de el puntero del árbol binario.
*/
void dmid _ Order _ Access(Bt node * head)
{
if (head!=null)
{
dmid _ Order _ Access(head- gt; l child);/*Atraviesa recursivamente el subárbol izquierdo*/
if(SHOWCHAR)
printf("c",head-gt;data);
Otros
printf("d",head-gt;data);
Otros
printf("d",head-gt;data);
p>
dmid _ Order _ Access(head- gt; rchild); /*Atraviesa recursivamente el subárbol de la derecha*/
}
}
/*
Función transversal de postorden del árbol binario dlast_order_access();
Descripción del parámetro:
BTNode *head: el puntero del nodo raíz del árbol binario.
*/
void dlast _ Order _ Access(Bt node * head)
{
if (head!=null)
{
dlast _ Order _ Access(head- gt; l child); /* Recorre recursivamente el subárbol izquierdo*/
dlast _ Order _ Access (head- gt; rchild); /* Recorre recursivamente el subárbol de la derecha*/
if(SHOWCHAR)
printf("c ", head- gt; data);
Otro
printf("d",head- gt; data);
}
}
// - parte recursiva.
// - Parte no recursiva.
/*
Función transversal de pedido anticipado de árbol binario pre_order_access():
Descripción del parámetro:
BTNode *head: Puntero a el nodo raíz del árbol binario.
*/
Anular pre_pedido_acceso(Bt nodo * cabeza)
{
BTNodo * pt
ABTStack *ps, *top
pt = head;
top = NULL
printf("\nReordenar los resultados del recorrido del árbol binario:\ t " );
Y (pt!=NULL ||top!=NULL) /*El árbol binario no ha sido recorrido por completo o la pila no está vacía*/
{
Y (pt!=null)
{
if(SHOWCHAR)
printf("c ", pt- gt; datos ); /*Acceder al nodo raíz*/
Otros
printf("d", pt- gt; data /*Acceder al nodo raíz*/
);PS =(abt stack *)malloc(sizeof(abt stack));/*Nodo raíz en la pila*/
PS- gt; - gt; link = top
top = ps
pt = pt- lchild/*Atraviesa el subárbol derecho del nodo y los nodos pasados se apilan en secuencia*/
}
If (top!=null)
{
pt = top- ptree/*El nodo en el la parte superior de la pila sale de la pila*/
ps = top
top = top- gt
Gratis /*Nodo libre; espacio en la parte superior de la pila*/
pt = pt- gt;*Atraviesa el subárbol derecho del nodo*/
}
}
}
/*
Acceso a pedidos a medio plazo ():
Descripción del parámetro:
BTNode *head: el puntero del nodo raíz del árbol binario.
*/
void mid _ Order _ Access(Bt node * head)
{
BTNode * pt
ABTStack *ps, *top
int contador = 1;
pt = encabezado
top = NULL
printf; ("\nResultado del recorrido en orden del árbol binario:\t");
And (pt!=NULL ||top!=NULL) /*El árbol binario no se ha recorrido por completo o la pila está no vacío* /
{
Y (pt!=null)
{
PS =(abt stack *)malloc( sizeof(abt stack));/*Nodo raíz en la pila*/
PS- gt; ptree = pt
PS- gt = top
top = ps
pt = pt- gt; lchild/*Atraviesa el subárbol derecho del nodo y los nodos pasados se apilan en secuencia*/
}
If (top! = vacío)
{
pt = top- gt; ptree/*El nodo en la parte superior de la pila sale de la pila*/
ps = top
top = top- gt;
Gratis /*Espacio de nodo libre en la parte superior de la pila*/
if(SHOWCHAR)
printf("c ", pt- gt; data /*Acceder al nodo raíz*/
Otros
printf("d ", pt- gt; data); /* Visita el nodo raíz*/
pt = pt- gt/*Atraviesa el subárbol derecho del nodo*/
}
}
}
/*
Acceso al último pedido():
Descripción del parámetro:
BTNode *head: la raíz del puntero de nodo del árbol binario.
*/
Anular último _ pedido _ Acceso (nodo Bt * cabeza)
{
BTNodo * pt
ABTStack *ps, *top
int contador = 1;
pt = encabezado
top = NULL
printf; ("\nResultado del recorrido en orden inverso del árbol binario:\t");
And (pt!=NULL ||top!=NULL) /*El árbol binario no se ha recorrido por completo, o la pila no está vacío*/
{
Y (pt!=null)
{
PS =(abt stack *)malloc (sizeof(abt stack )); /*Nodo raíz en la pila*/
PS- gt; ptree = pt
PS- gt; p>top = ps
pt = pt- gt; lchild/*Atraviesa el subárbol derecho del nodo y los nodos pasados se apilan en secuencia*/
}
If (top! = Vacío)
{
pt = top- gt; ptree/*El nodo en la parte superior de la pila sale de la pila*/ p>
ps = top
top = top- gt;
Gratis (PS) /*Espacio de nodo libre en la parte superior de la pila*/ p>
printf("c ", pt- gt; data);/*Acceder al nodo raíz*/
pt = pt- gt;rchild/*Atravesar el subárbol derecho del nodo* /
}
} p>
}
/*
Función de búsqueda estática del árbol de búsqueda binaria static_search_Stree() :
Descripción del parámetro:
BTNode *head: el puntero del nodo raíz del árbol de búsqueda binario.
Clave int: clave de búsqueda
Valor de retorno:
Static_Search_STree = Puntero de nodo con valor clave (encontrado)
Static_Search_STree = NULL( no encontrado)
*/
Nodo Bt * estático _ Buscar _ STree(nodo Bt * cabeza, tecla int)
{
mientras (head!=null)
{
if (head- gt; data == clave)
{
printf (" \ n campo de datos = d \ t dirección = d \ t \ n ", encabezado- gt; datos, encabezado
Return (head) /*find*/ p><); p>}
if(head- gt; data gt key)
head = head- gt; lchild/*continuar buscando en el subárbol izquierdo*/ p>
Otros
head = head- gt;rchild/*Continuar buscando en el subárbol derecho*/
}
Return (NULL );/*No encontrado */
}
/*
Función de búsqueda dinámica del árbol de búsqueda binariodynamic_search_stree():
p>Descripción del parámetro:
BTNode *head: el puntero del nodo raíz del árbol de búsqueda binario.
BTNode **parent: Puntero al nodo padre del nodo con el valor clave.
BTNode **head: Puntero al puntero de nodo cuyo valor clave es (encontrado) o NULL (no encontrado).
Clave int: clave de búsqueda
Nota:
*parent == NULL y *p == NULL no encontrado (el árbol binario está vacío)
*parent == NULL y *p! =NULL encontrado (nodo raíz encontrado)
*¡Padre! = NULL y *p == NULL (nodo hoja) > no encontrado.
*¡Padres! = NULO y *p! =Nulo encontrado (nodo intermedio)
*/
voiddynamic _ Search _ STree(Bt node * head, BTNode **parent, BTNode **p, int key) p>
{
* padre = NULL
*p =cabeza;
mientras(*p!=null)
{
if((* p)- gt; datos == clave)
return; /*buscar*/
* padre = * p; /*Continuar buscando con el nodo actual como nodo padre*/
if ((* p)- gt; data gt key)
* p = (* p)- gt;lchild/*Continuar buscando en el subárbol izquierdo*/
Otros
* p =(* p)- gt;rchild/*Continuar buscando en el subárbol derecho */
}
}
/*
Función de nodo de inserción del árbol de búsqueda binaria insert_node_stree():
Descripción del parámetro :
BTNode *head: el puntero del nodo raíz del árbol de búsqueda binario.
Clave int: clave de búsqueda
Valor de retorno:
Insert_Node_STree = 1 insertado correctamente.
Insert_Node_STree = 0 Error al insertar (el nodo ya existe).
*/
int Insertar _ Nodo _ STree(Bt Node * head, int key)
{
BTNode *p, *q, *nnode
Búsqueda dinámica.
p amp; q, key);
If (q!=null)
return(0); /*El nodo ya existe en el árbol*/
n nodo =(nodo Bt *)malloc(sizeof(nodo Bt));/*Crear nuevo nodo*/
nnodo->;data=key;
nnodo- > ;l child = n nodo- gt;rchild = NULL
if(p==NULL)
head = p;/*El árbol original está vacío, el nuevo nodo está un árbol de búsqueda */
Otro
{
if (p->; clave gt de datos)
p->; = nnode/ *Como nodo secundario izquierdo*/
Otro
p->; rchild = nnode/*Como nodo secundario derecho*/
}
Return (1); /*Inserción exitosa*/
}
/*
El árbol de búsqueda binaria inserta un lote de nodos función insert_batch_ node_stree():
Descripción del parámetro:
BTNode *head: el puntero del nodo raíz del árbol de búsqueda binario.
Int array[]: matriz de campos de datos insertados.
Int n: El número de nodos que se insertarán.
*/
void Insert _ Batch _ Node _ STree(Bt Node * head, int array[], int n)
{
int I;
for(I = 0; iltn;i)
{
if (!Insert_Node_STree(head, array[i] )
printf("\n¡Error de inserción!\n ",array[I]);
}
}
/ / - Parte no recursiva.
//Implementar la conversión entre árbol y árbol binario
estructura typedef BinaryTreeNode{
estructura binaria treenode * left child;
struct binario treenode * hijo derecho;
int valor;
};
estructura typedef TreeNode{
struct TreeNode * child[];
int child _ count
int valor
};
Nodo de árbol binario * árbol binario (Nodo de árbol * raíz){ p>
if(root == null)
Devuelve null
BinaryTreeNode * raíz binaria = new BinaryTreeNode();
raíz binaria- gt; valor = raíz- gt; valor;
raíz binaria- gt; hijo izquierdo = árbol binario (raíz- gt; hijo[0]); gt; leftChild
for(int I = 1; iltroot- gt; children_count; i){
brother- gt; right child = tobinary tree(root- gt; child[I] ]);
Hermano = hermano - gt; hijo correcto;
}
Devuelve raíz binaria
}