Algoritmos y Estructura de Datos

Árboles Binarios: operaciones de inserción, eliminación y busqueda


Los árboles binarios son una estructura de datos utilizada en la programación para almacenar y acceder a una colección de elementos de manera organizada. Cada elemento del árbol se conoce como un nodo y puede tener hasta dos hijos, lo que lo convierte en una estructura jerárquica.

A continuación se presentan algunas de las principales operaciones que se pueden realizar con árboles binarios:

Inserción:

Para insertar un elemento en un árbol binario, debes seguir los siguientes pasos:

  • Crea un nuevo nodo con el elemento que deseas insertar.
  • Si el árbol está vacío, el nuevo nodo se convierte en la raíz del árbol.
  • Si el árbol no está vacío, comienza a recorrer el árbol desde la raíz hasta encontrar un lugar donde insertar el nuevo nodo.
  • Compara el valor del nuevo nodo con el valor de cada nodo que encuentras mientras recorres el árbol. Si el valor del nuevo nodo es menor que el valor del nodo actual, continúa recorriendo el árbol hacia la izquierda. Si el valor del nuevo nodo es mayor, continúa recorriendo el árbol hacia la derecha.
  • Cuando encuentres un nodo cuyo hijo izquierdo o derecho esté vacío, inserta el nuevo nodo en esa posición.
  •                     
    1. class BinaryTree {
    2. private:
    3. struct TreeNode {
    4. int data;
    5. TreeNode* left;
    6. TreeNode* right;
    7. };
    8. TreeNode* root;
    9. void insert(TreeNode*&, int);
    10. public:
    11. BinaryTree() { root = NULL; }
    12. void insert(int data) { insert(root, data); }
    13. };
    14. void BinaryTree::insert(TreeNode*& node, int data) {
    15. if (node == NULL) {
    16. node = new TreeNode;
    17. node->data = data;
    18. node->left = node->right = NULL;
    19. }
    20. else if (data < node->data) {
    21. insert(node->left, data);
    22. }
    23. else {
    24. insert(node->right, data);
    25. }
    26. }
    Eliminación:

    Para eliminar un elemento de un árbol binario, debes seguir los siguientes pasos:

  • Comienza a recorrer el árbol desde la raíz hasta encontrar el nodo que deseas eliminar.
  • Una vez que encuentres el nodo a eliminar, verifica cuántos hijos tiene. Si el nodo no tiene hijos, simplemente lo eliminas y enlazas el padre del nodo con null.
  • Si el nodo tiene un hijo, enlaza el padre del nodo con el hijo del nodo y elimina el nodo.
  • Si el nodo tiene dos hijos, reemplázalo con el nodo más a la derecha del subárbol izquierdo o con el nodo más a la izquierda del subárbol derecho, dependiendo de la implementación del árbol. Luego elimina el nodo original.
  •                     
    1. class BinaryTree {
    2. private:
    3. struct TreeNode {
    4. int data;
    5. TreeNode* left;
    6. TreeNode* right;
    7. };
    8. TreeNode* root;
    9. void remove(TreeNode*&, int);
    10. public:
    11. BinaryTree() { root = NULL; }
    12. void remove(int data) { remove(root, data); }
    13. };
    14. void BinaryTree::remove(TreeNode*& node, int data) {
    15. if (node == NULL) {
    16. return;
    17. }
    18. if (data < node->data) {
    19. remove(node->left, data);
    20. }
    21. else if (data > node->data) {
    22. remove(node->right, data);
    23. }
    24. else {
    25. if (node->left == NULL && node->right == NULL) {
    26. delete node;
    27. node = NULL;
    28. }
    29. else if (node->left == NULL) {
    30. TreeNode* temp = node;
    31. node = node->right;
    32. delete temp;
    33. }
    34. else if (node->right == NULL) {
    35. TreeNode* temp = node;
    36. node = node->left;
    37. delete temp;
    38. }
    39. else {
    40. TreeNode* temp = node->right;
    41. while (temp->left != NULL) {
    42. temp = temp->left;
    43. }
    44. node->data = temp->data;
    45. remove(node->right, temp->data);
    46. }
    47. }
    48. }
    Buscar:

    Para buscar un elemento en un árbol binario, debes seguir los siguientes pasos:

  • Comienza a recorrer el árbol desde la raíz.
  • Compara el valor del elemento que estás buscando con el valor del nodo actual. Si son iguales, has encontrado el elemento y puedes detener la búsqueda.
  • Si el valor del elemento que estás buscando es menor que el valor del nodo actual, continúa recorriendo el árbol hacia la izquierda. Si el valor del elemento que estás buscando es mayor, continúa recorriendo el árbol hacia la derecha.
  • Repite el proceso hasta encontrar el elemento o hasta llegar a un nodo que sea null, lo que significa que el elemento no se encuentra en el árbol.
  •                     
    1. class BinaryTree {
    2. private:
    3. struct TreeNode {
    4. int data;
    5. TreeNode* left;
    6. TreeNode* right;
    7. };
    8. TreeNode* root;
    9. bool search(TreeNode*, int);
    10. public:
    11. BinaryTree() { root = NULL; }
    12. bool search(int data) { return search(root, data); }
    13. };
    14. bool BinaryTree::search(TreeNode* node, int data) {
    15. if (node == NULL) {
    16. return false;
    17. }
    18. if (node->data == data) {
    19. return true;
    20. }
    21. if (data < node->data) {
    22. return search(node->left, data);
    23. }
    24. else {
    25. return search(node->right, data);
    26. }
    27. }

    Link de apoyo

  • Arboles en C++
  • Árboles Binarios de Búsqueda en C++