Advertisement
purshink

TwoThreeNode

Aug 24th, 2021
1,682
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.73 KB | None | 0 0
  1.     public class TwoThreeTree<K extends Comparable<K>> {
  2.         private TreeNode<K> root;
  3.  
  4.         private static class TreeNode<K> {
  5.             private K leftKey;
  6.             private K rightKey;
  7.  
  8.             private TreeNode<K> leftChild;
  9.             private TreeNode<K> middleChild;
  10.             private TreeNode<K> rightChild;
  11.  
  12.             private TreeNode(K key) {
  13.                 this.leftKey = key;
  14.             }
  15.  
  16.             private TreeNode(K left,K middle,  K right) {
  17.                 this.leftKey = middle;
  18.                 this.leftChild = new TreeNode<>(left);
  19.                 this.rightChild = new TreeNode<>(right);
  20.             }
  21.  
  22.             boolean isThreeNode() {
  23.                 return rightKey != null;
  24.             }
  25.  
  26.             boolean isTwoNode() {
  27.                 return rightKey == null;
  28.             }
  29.  
  30.             boolean isLeaf() {
  31.                 return this.leftChild == null && this.middleChild == null && this.rightChild == null;
  32.             }
  33.         }
  34.  
  35.         public void insert(K key) {
  36.             if (this.root == null){
  37.                 this.root = new TreeNode<K>(key);
  38.             }
  39.             else{
  40.                 TreeNode<K> node = this.internalInsert(this.root, key);
  41.  
  42.                 if(node != null){
  43.                     this.root = node;
  44.                 }
  45.             }
  46.  
  47.         }
  48.  
  49.         private TreeNode<K> internalInsert(TreeNode<K> currentNode, K value) {
  50.  
  51.             if (currentNode.isLeaf()) {
  52.                 if (currentNode.isTwoNode()) {
  53.                     if (value.compareTo(currentNode.leftKey) < 0) {
  54.                         currentNode.rightKey = currentNode.leftKey;
  55.                         currentNode.leftKey = value;
  56.                     } else {
  57.                         currentNode.rightKey = value;
  58.                     }
  59.                 } else {
  60.                     K left = currentNode.leftKey;
  61.                     K middle = value;
  62.                     K right = currentNode.rightKey;
  63.  
  64.                     if (value.compareTo(left) < 0) {
  65.                         return new TreeNode<>(middle, left, right);
  66.                     } else if (value.compareTo(right) > 0) {
  67.                         return new TreeNode<>(left, right, middle);
  68.                     } else {
  69.                         return new TreeNode<>(left, middle, right);
  70.                     }
  71.                 }
  72.             } else {
  73.                 TreeNode<K> restructuredNode = null;
  74.  
  75.                 if (currentNode.isTwoNode() && value.compareTo(currentNode.leftKey) < 0) {
  76.                     restructuredNode = this.internalInsert(currentNode.leftChild, value);
  77.                 } else if (currentNode.isTwoNode() && value.compareTo(currentNode.leftKey) > 0) {
  78.                     restructuredNode = this.internalInsert(currentNode.rightChild, value);
  79.                 } else if (currentNode.isThreeNode() && value.compareTo(currentNode.leftKey) < 0) {
  80.                     restructuredNode = this.internalInsert(currentNode.leftChild, value);
  81.                 } else if (currentNode.isThreeNode() && value.compareTo(currentNode.rightKey) > 0) {
  82.                     restructuredNode = this.internalInsert(currentNode.rightChild, value);
  83.                 } else {
  84.                     restructuredNode = this.internalInsert(currentNode.middleChild, value);
  85.                 }
  86.                 if (restructuredNode != null) {
  87.                     if (currentNode.isTwoNode()) {
  88.                         if (restructuredNode.leftKey.compareTo(currentNode.leftKey) < 0) {
  89.                             currentNode.rightKey = currentNode.leftKey;
  90.                             currentNode.leftKey = restructuredNode.leftKey;
  91.  
  92.                             currentNode.leftChild = restructuredNode.leftChild;
  93.                             currentNode.middleChild = restructuredNode.rightChild;
  94.                         } else {
  95.                             currentNode.rightKey = restructuredNode.leftKey;
  96.  
  97.                             currentNode.middleChild = restructuredNode.leftChild;
  98.                             currentNode.rightChild = restructuredNode.rightChild;
  99.                         }
  100.                     } else {
  101.                         if (restructuredNode.leftKey.compareTo(currentNode.leftKey) < 0) {
  102.                             TreeNode<K> newNode = new TreeNode<>(currentNode.leftKey);
  103.                             newNode.leftChild = new TreeNode<>(restructuredNode.leftKey);
  104.                             newNode.rightChild = new TreeNode<>(currentNode.rightKey);
  105.  
  106.                             newNode.leftChild.leftChild = restructuredNode.leftChild;
  107.                             newNode.leftChild.rightChild = restructuredNode.rightChild;
  108.  
  109.                             newNode.rightChild.rightChild = currentNode.rightChild;
  110.                             newNode.rightChild.leftChild = currentNode.middleChild;
  111.  
  112.                             return newNode;
  113.  
  114.                         } else {
  115.                             TreeNode<K> newNode = new TreeNode<>(restructuredNode.leftKey);
  116.                             newNode.leftChild = new TreeNode<>(currentNode.leftKey);
  117.                             newNode.rightChild = new TreeNode<>(currentNode.rightKey);
  118.  
  119.  
  120.                             newNode.leftChild.leftChild = currentNode.leftChild;
  121.                             newNode.leftChild.rightChild = restructuredNode.leftChild;
  122.  
  123.                             newNode.rightChild.rightChild = currentNode.rightChild;
  124.                             newNode.rightChild.leftChild = restructuredNode.rightChild;
  125.  
  126.  
  127.                             return newNode;
  128.  
  129.                         }
  130.                     }
  131.                 }
  132.             }
  133.             return null;
  134.         }
  135.  
  136.         public String getAsString() {
  137.             StringBuilder out = new StringBuilder();
  138.             recursivePrint(this.root, out);
  139.             return out.toString().trim();
  140.         }
  141.  
  142.         private void recursivePrint(TreeNode<K> node, StringBuilder out) {
  143.             if (node == null) {
  144.                 return;
  145.             }
  146.             if (node.leftKey != null) {
  147.                 out.append(node.leftKey)
  148.                         .append(" ");
  149.             }
  150.             if (node.rightKey != null) {
  151.                 out.append(node.rightKey).append(System.lineSeparator());
  152.             } else {
  153.                 out.append(System.lineSeparator());
  154.             }
  155.             if (node.isTwoNode()) {
  156.                 recursivePrint(node.leftChild, out);
  157.                 recursivePrint(node.rightChild, out);
  158.             } else if (node.isThreeNode()) {
  159.                 recursivePrint(node.leftChild, out);
  160.                 recursivePrint(node.middleChild, out);
  161.                 recursivePrint(node.rightChild, out);
  162.             }
  163.         }
  164.     }
  165.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement