Árbol binario desde la entrada hasta la construcción de AC (1) y recorrido en el frente, medio y posterior

Interpretación del sustantivo y naturaleza

Primero cite la Enciclopedia Baidu:
Inserte la descripción de la imagen aquí
aquí hay una imagen para comprender el ejemplo que se usará de inmediato:
Inserte la descripción de la imagen aquí

1. Cómo construir un árbol binario

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

typedef struct BTNode
{
    
    
    int data;
    struct BTNode *Left;
    struct BTNode *Right;
}Node;


//创建二叉树,按前序输入
Node* createBTree()
{
    
    
    Node *p;
    int ch;
	//printf("输入data");
    scanf("%d",&ch);
    if(ch == 0)     //如果到了叶子节点,接下来的左、右子树分别赋值为0
    {
    
    
        p = NULL;
    }
    else
    {
    
    
        p = (Node*)malloc(sizeof(Node));
        p->data = ch;
        p->Left  = createBTree();  //递归创建左子树
        p->Right = createBTree();  //递归创建右子树
    }
    return p;
}
int main()
{
    
    
	int i;
    Node *root = NULL;
    root = createBTree();
 return 0;
 }

Este es un árbol binario construido con una lista enlazada de doble puntero de acuerdo con la entrada del pedido anticipado. Podemos encontrar que la lista enlazada es solo un método de almacenamiento. El orden de recorrido del árbol binario (y el orden de entrada) es el enfoque real.
Secuencia anterior: 1245367 como ejemplo
, cuando la entrada es 1 2 4 (nodo hoja) 0 0 5 (nodo hoja) 0 0 3 6 (nodo hoja) 00 7 (nodo hoja) 00

En segundo lugar, el primer, medio y último recorrido del árbol binario.

Orden de recorrido

El recorrido consiste en atravesar cada nodo del árbol binario en un
orden determinado . Hay tres tipos de secuencias de la siguiente manera:

(1) Cruce de orden frontal (primer) (raíz izquierda y derecha)

(2) Recorrido en orden (raíz izquierda derecha)

(3) Recorrido posterior al pedido (raíz izquierda y derecha)

Entonces, cuando nos enfrentamos a un árbol binario, podemos escribir de forma recursiva el primer, medio y último recorrido de acuerdo con la regla anterior.
Regala una castaña:Inserte la descripción de la imagen aquí

Preámbulo : ABDECFG
Dado que se trata de una raíz recursiva, para escribir el nodo raíz A y sus nodos secundarios izquierdo y derecho :
el ABC;
Inserte la descripción de la imagen aquí

Luego comience la recursividad.Cuando B es la raíz, agregue los nodos secundarios izquierdo y derecho D y E después de B :
AB DE C;
Inserte la descripción de la imagen aquí

Cuando C es la raíz, agregue los nodos secundarios izquierdo y derecho FG después de C :
AB DE C FG;
porque después de DFEG , no hay ningún nodo secundario y el final recursivo es el resultado del recorrido como se indicó anteriormente.
Inserte la descripción de la imagen aquí

El método de orden medio es el anterior: escriba BAC primero;
agregue B de acuerdo con la raíz izquierda y derecha:
DBE AC;
agregue la solución final para C:
DBEAFCG;

La siguiente secuencia es la misma que la anterior:
BCA;
DEBCA;
DEBFGCA; obtén
la solución.
Cualquier árbol binario se puede escribir de forma recursiva como se indicó anteriormente, y este método recursivo seguirá utilizándose en los algoritmos posteriores.

Preguntas avanzadas y de muestra

¿Cómo usar el código para encontrar el orden de un árbol binario?
Podemos confirmar un árbol binario por preorden y orden medio , y encontrar el postorder en secuencia;
también podemos confirmar por medio y postorder , y encontrar el preorden
pero solo es imposible construir un árbol binario si es pre-orden y post-orden ;
use un ejemplo para ilustrar:
Entrada:
Dos líneas ingresan pre-orden y orden medio respectivamente
Salida:
salida post-orden

Idea: No necesitamos apresurarnos para construir un árbol binario. Con preorden y orden medio, el árbol en sí se ha establecido de acuerdo con las reglas anteriores, aunque solo existe en la matriz. En otras palabras, como estructura de datos, la connotación real de un árbol binario radica en su orden, en lugar de usar sin alma una lista enlazada con un puntero para almacenarlo.
Entonces el preorden es la raíz izquierda y derecha, el orden medio es la raíz izquierda derecha, primero encontramos la raíz a través del preorden (el primero en el preorden), la izquierda de esta raíz en el orden medio es el subárbol izquierdo y el de la derecha es el subárbol derecho, luego realice la recursividad anterior y genere el nodo.
Explique el malentendido en términos sencillos: recursivamente y luego salida, luego la primera salida es el resultado más profundo de DFS, y la última salida es el resultado actual.
Tome el orden anterior ABC como ejemplo, el orden medio es BAC, para encontrar el orden posterior, primero encuentre la raíz A. En el orden medio, el lado izquierdo de A es B y el lado derecho C, recursivo a B , sin salida de subárbol, recursivo a C, sin salida de subárbol, recursivo Salida completa A.
Código:

#include<stdio.h>
#include<string.h>
char a[28],b[28];
void dfs(int w,int x,int y,int z)//深搜
{
    
    int i=0,j=0;
    if(w>x||y>z)//无法继续递归时
return;
for(i=w;i<=x;i++)
    if(a[i]==b[y])//在中序中找到根
{
    
    dfs(w,i-1,y+1,y+i-w);//递归左子树
dfs(i+1,x,y+i-w+1,z);//递归右子树
        printf("%c",a[i]);//递归完后输出,注意,是递归完
}
}
int main()
{
    
    
int i=0,j=0,k=0;
scanf("%s",b);//输入前序
scanf("%s",a);//输入中序
j=strlen(a);
k=strlen(b);
dfs(0,j-1,0,k-1);//进入递归
    return 0;
}

Con respecto a dfs y árboles binarios, se mencionó en DFS y en permutación y combinación
, pero en ese momento el árbol binario se parecía más a una estructura de juicio lógico que a una estructura de almacenamiento.
Actualice de nuevo cuando haya tiempo.

Supongo que te gusta

Origin blog.csdn.net/weixin_43736127/article/details/113797972
Recomendado
Clasificación