Tipo de datos abstracto de árbol binario

Tipo de datos abstracto de árbol binario

1. Análisis teórico

  1. Los nodos son la base de los árboles binarios y, por lo general, se utilizan para almacenar información relacionada con las aplicaciones.
  2. Como representación de un árbol binario, también es necesario registrar la información estructural del árbol binario. Al menos es necesario asegurarse de que se pueda verificar la relación padre-hijo del nodo, por ejemplo, el hijo izquierdo / derecho el nodo se puede encontrar desde un nodo

La siguiente es la definición de un tipo de datos abstracto de árbol binario básico:

ADT BinTree:   # 一个二叉树抽象数据类型
    BinTree(self, data, left, right)  # 构造操作,创建一个新二叉树
    is_empty(self)    # 判断self是否为一个空二叉树
    num_nodes(self)	  # 求二叉树的结点个数
    data(self)		  # 获取二叉树根存储的数据 
    left(self)		  # 获取二叉树的左子树
    right(self)       # 获取二叉树的右子树
    set_left(self, btree)   # 用btree取代原来的左子树
    set_right(self, btree)  # 用btree取代原来的右子树
    traversal(self)		   # 遍历二叉树中各结点数据的迭代器
    forall(self, op)	   # 对二叉树中的每个结点的数据执行操作op

La operación básica de un árbol binario debe incluir la creación de un árbol binario. La construcción de un árbol binario debe basarse en dos árboles binarios existentes y un dato que desee guardar en el nodo raíz del árbol. La representación de un árbol binario vacío es un problema, porque el árbol binario vacío no tiene espacio de información. En la implementación, se puede representar con un valor especial, como Ninguno en Python. La implementación real también puede introducir una estructura que represente específicamente un árbol binario y coloque el nodo del árbol bajo su jurisdicción.

2. Recorre el árbol binario

  1. Cada árbol binario tieneEl único nodo raíz, Puede ser considerado como el identificador único de este árbol binario, y es la entrada al proceso de procesamiento basado en la estructura del árbol. Partiendo del nodo raíz, se debe encontrar toda la información en el árbol, y la base es busque dos nodos secundarios del nodo principal.

    por lo tanto,En la práctica, el nodo raíz de un árbol binario de uso común representa este árbol binario, y sus subárboles izquierdo y derecho están representados por sus nodos raíz.

  2. Cada nodo del árbol binario puede almacenar algunos datos, por lo que también es una estructura de datos del tipo de colección. Para cualquier estructura de colección, existe el problema de procesar los elementos de datos almacenados en ella uno por uno, es decir, atravesar los elementos y atravesar un árbol binario. Una forma sistemática de acceder a cada nodo del árbol binario una vez. Este proceso se puede implementar en base a las operaciones básicas del árbol binario, y los datos en los nodos se pueden manipular durante el recorrido.

  3. Muchas operaciones complejas de árbol binario deben implementarse en función del recorrido, como encontrar el nodo padre de un nodo. Hacer esto en un árbol binario es como encontrar el nodo anterior en una lista unida.

  4. Si cada nodo del árbol binario tiene un identificador único, el árbol binario dado determina de manera única su primera secuencia raíz, secuencia raíz inversa y secuencia simétrica.Dado cualquier tipo de secuencia transversal de un árbol binario, el árbol binario correspondiente no se puede determinar de forma única

  5. Si conoce la secuencia simétrica de un árbol binario y conoce otra secuencia transversal (ya sea la primera raíz o la última secuencia raíz), puede determinar de forma única el árbol binario correspondiente

La forma básica de atravesar un árbol binario

  1. Travesía en profundidad primero

    1. Cruce de primer orden raíz (DLR) -----> Primer orden raíz
    2. Recorrido de secuencia de raíz media (LDR), también conocido como secuencia simétrica --------> secuencia de raíz media
    3. Traslado de la secuencia posterior a la raíz (LRD) ------> Secuencia posterior a la raíz
  2. Cruce primero en amplitud, también conocido como recorrido de orden jerárquico

[Error en la transferencia de la imagen del enlace externo. El sitio de origen puede tener un mecanismo anti-hotlinking. Se recomienda guardar la imagen y subirla directamente (img-8HY9ODmd-1610347997607) (C: \ Users \ 93623 \ AppData \ Roaming \ Typora \ typora-user-images \ image-20210111102051381.png)]

Cruce del primer orden raíz: ABDHEICFJKG (comenzando desde la raíz superior, siempre buscando la raíz inferior)

Cruce de orden de raíz media: DHBEIAJFKCG (comenzando desde la hoja inferior)

Traslado del orden posterior a la raíz: HDIEBJKFGCA (comenzando desde la hoja inferior)

Travesía primero en anchura: ABCDEFGHIJK

Atravesar y buscar

Un árbol binario se puede considerar como un espacio de estados, el nodo raíz corresponde al estado inicial del espacio de estados y la relación de adyacencia entre los estados de conexión de los nodos padre e hijo.

Un recorrido de árbol binario es una búsqueda que cubre todo el espacio de estados. Los métodos y técnicas de implementación relacionados con la búsqueda del espacio de estados se pueden trasplantar al problema de recorrido de árbol binario tal como son, como: métodos de búsqueda recursivos, no recursivos basados ​​en pilas búsqueda (recorrido en profundidad primero), la búsqueda en amplitud primero basada en cola corresponde al recorrido del orden de capa.

El recorrido es un proceso sistemático de enumeración de nodos. En la práctica, puede que no sea necesario verificar todos los nodos y, a veces, debe finalizar después de encontrar la información requerida. Este tipo de búsqueda también puede ser necesaria en un árbol binario.

En el proceso de búsqueda del espacio de estados, registre la conexión de un estado a otro y trátelo como un enlace entre nodos, y encontrará que este proceso de búsqueda en realidad construye un árbol, llamado árbol de búsqueda. En otras palabras, la estructura así formada no es un árbol binario sino un árbol general.

Lista de implementación de árbol binario

  1. En pocas palabras, un nodo de árbol binario es un triple, y los elementos son los subárboles izquierdo y derecho y los datos del nodo. La lista o tupla de Python se puede usar para combinar estos tres elementos. La diferencia entre los dos es solo en la variabilidad. Para implementar un árbol binario no modificable, puede usar tuple como mecanismo de combinación. Para implementar un árbol binario que pueda modificar la estructura, debe usar list.
  2. Diseño e implementación
    1. El árbol binario es una estructura recursiva y la lista de Python también es una estructura recursiva, por lo que es fácil implementar un árbol binario basado en el tipo de lista.
    2. El árbol vacío está representado por Ninguno
    3. Un árbol binario no vacío se representa mediante una tabla de tres elementos [d, l, r]

[Error en la transferencia de la imagen del enlace externo. El sitio de origen puede tener un mecanismo anti-hotlinking. Se recomienda guardar la imagen y subirla directamente (img-hR7ed6WS-1610347997612) (C: \ Users \ 93623 \ AppData \ Roaming \ Typora \ typora-user-images \ image-20210111135804215.png)]

[A, [B, Ninguno, Ninguno], [C, [D, [F, Ninguno, Ninguno], [G, Ninguno, Ninguno], [E, [I, Ninguno, Ninguno], [H, Ninguno, Ninguno] ]]]]

# 二叉树的实现和操作
def BinTree(data, left=None, right=None):
    return (data, left, right)

def is_empty_BinTree(btree):
    return btree is None

def root(btree):
    return btree[0]

def left(btree):
    return btree[1]

def right(btree):
    return btree[2]

def set_root(btree, data):
    btree[0]=data
 
def set_left(btree, left):
    btree[1] = left
  
def set_right(btree, right):
    btree[2]= right

El constructor BinTree proporciona valores predeterminados para los dos últimos parámetros, principalmente para facilitar su uso. Significa que estos dos subárboles están vacíos cuando no se dan los subárboles izquierdo y derecho. Basado en la llamada anidada del constructor, binario arbitrariamente complejo se pueden hacer árboles, por ejemplo:

t1 = BinTree (2, BinTree (4), BinTree (8))

Esto es equivalente a escribir: t1 = [2, [4, Ninguno, Ninguno], [8, Ninguno, Ninguno]]

Puede modificar cualquier parte del árbol binario, por ejemplo

set_left (izquierda (t1), BinTree (5))

Entre ellos, el subárbol izquierdo del subárbol izquierdo de t1 se reemplaza por BinTree (5), de modo que el valor de t1 se convierte en: [2, [4, [5, Ninguno, Ninguno]], [8, Ninguno, Ninguno] ]

Este es un árbol binario con una altura de 2 y el número de niveles de anidación dentro de la lista es igual a la altura del árbol.

El subárbol izquierdo del subárbol izquierdo de t1 se reemplaza por BinTree (5), por lo que el valor de t1 se convierte en: [2, [4, [5, Ninguno, Ninguno]], [8, Ninguno, Ninguno]]

Este es un árbol binario con una altura de 2 y el número de niveles de anidación dentro de la lista es igual a la altura del árbol.

Supongo que te gusta

Origin blog.csdn.net/weixin_46129834/article/details/112469526
Recomendado
Clasificación