Advertisement
Cabana_Mario_Ariel_F

TP5_BinarySearchTree_Definitivo

Nov 12th, 2020 (edited)
254
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.29 KB | None | 0 0
  1. //
  2. // Created by Julio Tentor <jtentor@fi.unju.edu.ar>
  3. //
  4.  
  5. public class BinarySearchTree<ELEMENT extends Comparable<ELEMENT>> extends BinaryTree<ELEMENT> {  
  6.     public BinarySearchTree() {
  7.         super();
  8.     }  
  9.     public void add(ELEMENT item) {
  10.         if (this.root == null) {
  11.             this.root = new BTNode<ELEMENT>(item, null, null);
  12.         } else {
  13.             BTNode<ELEMENT> temp = this.root;
  14.             BTNode<ELEMENT> prev = null;
  15.             while (temp != null ) {
  16.                 prev = temp;
  17.                 if (item.compareTo(temp.item) < 0) {
  18.                     temp = temp.left;
  19.                 } else {
  20.                     temp = temp.right;
  21.                 }
  22.             }
  23.             temp = new BTNode<ELEMENT>(item, null, null);
  24.             if (item.compareTo(prev.item) < 0) {
  25.                 prev.left = temp;
  26.             } else {
  27.                 prev.right = temp;
  28.             }
  29.         }
  30.     }
  31.  
  32.  
  33.     public ELEMENT remove(ELEMENT item) {
  34.         return removeByCopy(item);
  35.         //return removeByFusion(item);
  36.     }
  37.  
  38.  
  39.     private ELEMENT removeByCopy(ELEMENT item) {
  40.         BTNode<ELEMENT> find = this.root;
  41.         BTNode<ELEMENT> prev = null;
  42.         while ((find != null) && (find.item.compareTo(item) != 0)) {
  43.             prev = find;
  44.             if (item.compareTo(find.item) < 0) {
  45.                 find = find.left;
  46.             } else {
  47.                 find = find.right;
  48.             }
  49.         }
  50.         if (find == null) {
  51.             throw new RuntimeException("No existe el elemento o el árbol está vacío");
  52.         } // find es el nodo con el valor a extraer y prev el padre de ese nodo
  53.         ELEMENT save = find.item;
  54.         BTNode<ELEMENT> node = find;
  55.         if (node.right == null) { // no hay subarbol derecho
  56.             node = node.left; // nodo con un descendiente u hoja
  57.         } else {
  58.             if (node.left == null) { // no hay subarbol izquierdo
  59.                 node = node.right; // nodo con un descendiente u hoja
  60.             } else { // dos descendientes
  61.                 BTNode<ELEMENT> last = node;
  62.                 BTNode<ELEMENT> temp = node.right; // a la derecha (mayores)
  63.                 while (temp.left != null) { // busca a la izquierda el menor
  64.                     last = temp;
  65.                     temp = temp.left;
  66.                 }
  67.                 // temp es el menor de los mayores
  68.                 node.item = temp.item; // hace la copia
  69.                 if (last == node) {
  70.                     last.right = temp.right;
  71.                 } else {
  72.                     last.left = temp.right;
  73.                 }
  74.                 temp.right = null;
  75.             }
  76.         }
  77.         // reajustar el arbol
  78.         if (find == this.root) {
  79.             this.root = node;
  80.         } else {
  81.             if (prev.left == find) {
  82.                 prev.left = node;
  83.             } else {
  84.                 prev.right = node;
  85.             }
  86.         }
  87.         return save;
  88.     }
  89.  
  90.  
  91.     private ELEMENT removeByFusion(ELEMENT item) {
  92.         BTNode<ELEMENT> find = this.root;
  93.         BTNode<ELEMENT> prev = null;
  94.         while ((find != null) && (find.item.compareTo(item) != 0)) {
  95.             prev = find;
  96.             if (item.compareTo(find.item) < 0) {
  97.                 find = find.left;
  98.             } else {
  99.                 find = find.right;
  100.             }
  101.         }
  102.         if (find == null) {
  103.             throw new RuntimeException("No existe el elemento o el árbol está vacío");
  104.         }
  105.         ELEMENT save = find.item;
  106.         BTNode<ELEMENT> node = find;
  107.         if (node.right == null) {
  108.             node = node.left;
  109.         } else {
  110.             if (node.left == null) {
  111.                 node = node.right;
  112.             } else {
  113.                 BTNode<ELEMENT> temp = node.right;
  114.                 while (temp.left != null) {
  115.                     temp = temp.left;
  116.                 }
  117.                 temp.left = node.left;
  118.                 node = node.right;
  119.             }
  120.         }
  121.         if (find == this.root) {
  122.             this.root = node;
  123.         } else {
  124.             if (prev.left == find) {
  125.                 prev.left = node;
  126.             } else {
  127.                 prev.right = node;
  128.             }
  129.         }
  130.         find.left = find.right = null;
  131.         return save;
  132.     }
  133.  
  134. }
  135.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement