Tabla de contenido
- prefacio
- ¿Qué es un árbol de búsqueda binaria?
- Construir un árbol de búsqueda binaria
- Operaciones en árboles de búsqueda binarios
- Insertar datos en el árbol de búsqueda binaria
- Buscar datos en un árbol de búsqueda binaria
- Eliminar un nodo en un árbol de búsqueda binaria
- nodo sucesor predecesor
- Tres casos de eliminación de un nodo
- Código de implementación
- código completo
- Resumir
prefacio
Anteriormente presentamos la estructura de datos del árbol binario y el algoritmo transversal del árbol binario. En este artículo, aprenderemos sobre un árbol binario especial: el árbol de búsqueda binaria BST (árbol de búsqueda binaria BST), también llamado árbol de clasificación binaria y árbol binario. árbol de búsqueda
¿Qué es un árbol de búsqueda binaria?
Un árbol de búsqueda binario es ante todo un árbol binario, y además cumple las siguientes características:
- Para cualquier nodo que no esté vacío, el valor en su subárbol izquierdo debe ser menor que el valor actual ;
- Para cualquier nodo que no esté vacío, el valor en su subárbol derecho debe ser mayor que el valor actual ;
- Cualquier subárbol satisface las condiciones anteriores;
Como se muestra abajo:
La imagen de arriba es un árbol de búsqueda binaria. Tomemos el nodo raíz como ejemplo. El valor del nodo raíz es 71, y los valores de su subárbol izquierdo son 22, 35, 46, 53 y 66 respectivamente, que satisfacen el subárbol izquierdo es más pequeño que el valor actual; los valores de su subárbol derecho son 78, 87 y 98 respectivamente, estos valores satisfacen el requisito de que el subárbol derecho es mayor que el valor actual; y así sucesivamente, así la figura anterior es un árbol de búsqueda binaria.
De acuerdo con las características del árbol de búsqueda binaria, también podemos obtener las siguientes conclusiones:
- El subárbol izquierdo y el subárbol derecho de cualquier nodo del árbol de búsqueda binario son un árbol de búsqueda binario;
- El nodo más pequeño del árbol de búsqueda binaria es el nodo hoja en la esquina inferior izquierda de todo el árbol ;
- El nodo más grande del árbol de búsqueda binaria es el nodo hoja en la esquina inferior derecha de todo el árbol ;
Construir un árbol de búsqueda binaria
Ahora usamos JavaScript para construir un árbol de búsqueda binaria. Debemos saber que un árbol de búsqueda binaria también se compone de nodos. Aquí creamos class
una clase de nodo,
El código de ejemplo es el siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 dieciséis |
|
Aquí, un nodo consta de cuatro partes, que son un puntero al subárbol izquierdo, un puntero al subárbol derecho, un puntero al nodo principal y el valor actual.
Operaciones en árboles de búsqueda binarios
Ya hemos introducido la operación de recorrido del árbol binario en el artículo anterior, y no la repetiremos aquí, aquí presentamos principalmente las siguientes operaciones:
- operación de inserción
- encontrar operación
- borrar operación
Insertar datos en el árbol de búsqueda binaria
La idea de insertar datos en un árbol de búsqueda binario es la siguiente:
- Determine
root
si está vacío, si está vacío, cree la raíz; - Si
root
no está vacío, debe juzgar si el nodo insertado es más grande o más pequeñoval
que el nodo raíz ;val
- Si es más pequeño que el nodo raíz, significa que es un nodo del subárbol izquierdo;
- Si es mayor que el nodo raíz, significa que es el nodo del subárbol derecho;
- Los dos pasos anteriores se repiten hasta que se encuentra un punto, si el punto es menor que el valor que queremos insertar y no hay un subárbol derecho, use este punto como su nodo de hoja derecha, si el punto es mayor que el valor que queremos para insertar y no existe Para el subárbol derecho, use este punto como su nodo de hoja izquierdo.
El código de ejemplo es el siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 dieciséis 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
|
Se define un método en la clase insertNode
, que acepta un valor o una matriz de tipos de valores y lo inserta en el árbol de búsqueda binaria; para el método de inserción, definimos un #insertNode
método privado para la inserción de nodos.
Para ver el efecto, aquí definimos un método estático para el recorrido en orden (porque el orden del recorrido en orden es izquierda-raíz-derecha, la clasificación en orden se usa en el árbol de búsqueda binaria y los resultados finales se ordenan de pequeño a grande) este árbol, y devuelve una matriz,
El código de ejemplo es el siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 dieciséis 17 18 19 20 21 |
|
El código de prueba es el siguiente:
const árbol = new BinarySearchTree()
tree.insertNode([71, 35, 87, 22, 53, 46, 66, 78, 98])
const arr = BinarySearchTree.inorder(tree.root)
console.log(arr) // [ 22, 35, 46, 53, 66,71, 78, 87, 98 ]
La estructura de árbol final es la siguiente:
Buscar datos en un árbol de búsqueda binaria
现在我们封装一个find
方法,用于查找二叉搜索树中的某个数据,假如我们查找66这个数据,利用上面那个树,
其查找思路如下图所示:
递归方式实现如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
迭代方式实现如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
两者相对来说,使用迭代的方式更优一些。
删除二叉搜索树的某个节点
前驱后继节点
在开始删除二叉搜索树中的某个节点之前,我们先来了解一下什么是前驱和后继节点;
- 前驱节点指的是使用中序遍历当前二叉搜索树时,当前节点的上一个节点就是前驱节点,换一种说法就是在二叉搜索树中,当前节点的左子树的最大值,就是该节点的前驱节点;
- 后继节点指的是使用中序遍历当前二叉搜索树时,当前节点的下一个节点就是后继节点,换一种说法就是在二叉搜索树中,当前节点的右子树的最小值,就是该节点的后继节点;
如下图所示:
了解了什么是前驱和后继节点之后,现在我们来开始删除某个节点。
删除一个节点的三种情况
当删除的节点是叶子节点时,只需要将指向它的指针修改为null
,即可,如下图所示:
当需要删除的节点存在一个子节点时, 需要将要删除节点的子节点的parent
指针指向要删除节点的父节点,然后将当前要删除节点的父节点指向子节点即可,
如下图所示:
当需要删除的节点存在一个子节点时, 删除步骤如下:
- 找到当前节点的前驱或者后继节点,这里选择后继;
- Luego asigne el valor del nodo sucesor al nodo actual;
- Eliminar el nodo sucesor.
Como se muestra abajo:
Ahora que hemos analizado estas situaciones, implementémoslas a través del código.
Código de implementación
El código de implementación es el siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 dieciséis 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 sesenta y cinco 66 67 68 69 70 71 72 |
|
código completo
El código completo de este artículo es el siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 dieciséis 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 sesenta y cinco 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 |
|