Viksy

Two-Three Tree

Apr 10th, 2022 (edited)
353
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.09 KB | None | 0 0
  1. public void insert(K key) {
  2.         if(this.root == null){
  3.             this.root = new TreeNode<>(key);
  4.             return;
  5.         }
  6.  
  7.         TreeNode<K> newRoot = this.insert(this.root, key);
  8.  
  9.         if(newRoot != null){
  10.             this.root = newRoot;
  11.         }
  12.     }
  13.  
  14.     private TreeNode<K> insert(TreeNode<K> node, K key) {
  15.         if(node.isLeaf()){
  16.             if(node.isTwoNode()){
  17.                 if(node.leftKey.compareTo(key) < 0){
  18.                     node.rightKey = key;
  19.                 } else{
  20.                     node.rightKey = node.leftKey;
  21.                     node.leftKey = key;
  22.                 }
  23.  
  24.                 return null;
  25.             }
  26.             K left = node.leftKey;
  27.             K middle = key;
  28.             K right = node.rightKey;
  29.  
  30.             if(middle.compareTo(left) < 0){
  31.                 left = key;
  32.                 middle = node.leftKey;
  33.             } else if(middle.compareTo(right) > 0){
  34.                 right = key;
  35.                 middle = node.rightKey;
  36.             }
  37.  
  38.             return new TreeNode<>(middle, left, right);
  39.         }
  40.  
  41.         TreeNode<K> toFix = null;
  42.         if(node.isTwoNode() && node.leftKey.compareTo(key) > 0){
  43.             toFix = this.insert(node.leftChild, key);
  44.         } else if(node.isTwoNode() && node.leftKey.compareTo(key) < 0){
  45.             toFix = this.insert(node.rightChild, key);
  46.         } else if(node.isThreeNode() && node.leftKey.compareTo(key) > 0){
  47.             toFix = this.insert(node.leftChild, key);
  48.         } else if(node.isThreeNode() && node.rightKey.compareTo(key) < 0){
  49.             toFix = this.insert(node.rightChild, key);
  50.         } else {
  51.             toFix = this.insert(node.middleChild, key);
  52.         }
  53.  
  54.         if(toFix == null) return null;
  55.  
  56.         if(node.isTwoNode()){
  57.             if(toFix.leftKey.compareTo(node.leftKey) < 0){
  58.                 node.rightKey = node.leftKey;
  59.                 node.leftKey = toFix.leftKey;
  60.  
  61.                 node.leftChild = toFix.leftChild;
  62.                 node.middleChild = toFix.rightChild;
  63.             } else{
  64.                 node.rightKey = toFix.leftKey;
  65.  
  66.                 node.middleChild = toFix.leftChild;
  67.                 node.rightChild = toFix.rightChild;
  68.             }
  69.  
  70.             return null;
  71.         }
  72.  
  73.         K promoteValue = null;
  74.         TreeNode<K> left = null;
  75.         TreeNode<K> right = null;
  76.  
  77.         if(toFix.leftKey.compareTo(node.leftKey) < 0){
  78.             promoteValue = node.leftKey;
  79.             left = toFix;
  80.             right = new TreeNode<>(node.rightKey, node.middleChild, node.rightChild);
  81.         } else if(toFix.leftKey.compareTo(node.rightKey) > 0){
  82.             promoteValue = node.rightKey;
  83.             left = new TreeNode<>(node.leftKey, node.leftChild, node.middleChild);
  84.             right = toFix;
  85.         } else{
  86.             promoteValue = toFix.leftKey;
  87.             left = new TreeNode<>(node.leftKey, node.leftChild, toFix.leftChild);
  88.             right = new TreeNode<>(node.rightKey, toFix.rightChild, node.rightChild);
  89.         }
  90.  
  91.         return new TreeNode<>(promoteValue, left, right);
  92.     }
Add Comment
Please, Sign In to add comment