Actualización de la estructura de datos: día 13

 

Tabla de contenido

1. Buscar en el árbol de búsqueda binaria

 1. recursividad

Análisis de complejidad

2. Iteración

Análisis de complejidad

2. Operación de inserción en el libro de búsqueda binaria.

 1. Simulación

Ideas y algoritmos

Análisis de complejidad

1. Buscar en el árbol de búsqueda binaria

700. Buscar en un árbol de búsqueda binario - LeetCode https://leetcode.cn/problems/search-in-a-binary-search-tree/?plan=data-structures&plan_progress=ggfacv7

 1. recursividad

Los árboles de búsqueda binaria satisfacen las siguientes propiedades:

Los valores de los elementos de todos los nodos en el subárbol izquierdo son menores que el valor de los elementos de la raíz; los
valores de los elementos de todos los nodos en el subárbol derecho son mayores que el valor de los elementos de la raíz.
En base a esto se puede obtener el siguiente algoritmo:

Si raíz está vacía, devuelve un nodo vacío;
si val=root.val, devuelve \textit{root}root;
si val<root.val, recurre al subárbol izquierdo;
si val>root.val, recurre al subárbol derecho.

class Solution {
public:
    TreeNode *searchBST(TreeNode *root, int val) {
        if (root == nullptr) {
            return nullptr;
        }
        if (val == root->val) {
            return root;
        }
        return searchBST(val < root->val ? root->left : root->right, val);
    }
};

Análisis de complejidad

Complejidad del tiempo: O (N), donde N es el número de nodos en el árbol de búsqueda binario. En el peor de los casos, el árbol de búsqueda binario es una cadena y el elemento que buscamos es más pequeño (más grande) que el elemento al final de la cadena, en este caso necesitamos recurrir N veces.

Complejidad espacial: O (N). La recursividad requiere espacio de pila O(N) en el peor de los casos.

2. Iteración

Cambiamos el método recursivo del método 1 a escritura iterativa:

Si raíz está vacía, salte del bucle y devuelva un nodo vacío;
si val=root.val, devuelva raíz;
si val<root.val, establezca raíz en root.left;
si val>root.val, establezca raíz en raíz.derecha.

class Solution {
public:
    TreeNode *searchBST(TreeNode *root, int val) {
        while (root) {
            if (val == root->val) {
                return root;
            }
            root = val < root->val ? root->left : root->right;
        }
        return nullptr;
    }
};

Análisis de complejidad

Complejidad del tiempo: O (N), donde NN es el número de nodos del árbol de búsqueda binario. En el peor de los casos, el árbol de búsqueda binario es una cadena y el elemento que buscamos es más pequeño (más grande) que el elemento al final de la cadena, en este caso necesitamos iterar N veces.

Complejidad espacial: O(1). No se utiliza espacio adicional.

2. Operación de inserción en el libro de búsqueda binaria.

701. Operación de inserción en un árbol de búsqueda binaria - LeetCode https://leetcode.cn/problems/insert-into-a-binary-search-tree/?plan=data-structures&plan_progress=ggfacv7

 1. Simulación

Ideas y algoritmos

Primero, revise las propiedades de los árboles de búsqueda binarios: para cualquier raíz de nodo, los valores de todos los nodos en el subárbol izquierdo (si existe) son menores que root.val, y los valores de todos los nodos en el subárbol derecho (si existe) son mayores que root.val y todos son árboles de búsqueda binarios.

Por lo tanto, al insertar val en un subárbol con raíz, puede determinar en qué subárbol insertar val en función de la relación de tamaño entre val y root.val.

Si el subárbol no está vacío, el problema se transforma en insertar \textit{val}val en el subárbol correspondiente.
De lo contrario, cree un nuevo nodo con \textit{val}val como valor aquí y vincúlelo a la raíz de su nodo principal.

class Solution {
public:
    TreeNode* insertIntoBST(TreeNode* root, int val) {
        if (root == nullptr) {
            return new TreeNode(val);
        }
        TreeNode* pos = root;
        while (pos != nullptr) {
            if (val < pos->val) {
                if (pos->left == nullptr) {
                    pos->left = new TreeNode(val);
                    break;
                } else {
                    pos = pos->left;
                }
            } else {
                if (pos->right == nullptr) {
                    pos->right = new TreeNode(val);
                    break;
                } else {
                    pos = pos->right;
                }
            }
        }
        return root;
    }
};

Análisis de complejidad

Complejidad del tiempo: O (N), donde N es el número de nodos en el árbol. En el peor de los casos, necesitamos insertar el valor en el nodo de hoja más profundo del árbol, y el nodo de hoja más profundo es O (N).

Complejidad espacial: O(1). Solo utilizamos un tamaño constante de espacio.

Supongo que te gusta

Origin blog.csdn.net/m0_63309778/article/details/126746985
Recomendado
Clasificación