Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public void insert(K key) {
- if(this.root == null){
- this.root = new TreeNode<>(key);
- return;
- }
- TreeNode<K> newRoot = this.insert(this.root, key);
- if(newRoot != null){
- this.root = newRoot;
- }
- }
- private TreeNode<K> insert(TreeNode<K> node, K key) {
- if(node.isLeaf()){
- if(node.isTwoNode()){
- if(node.leftKey.compareTo(key) < 0){
- node.rightKey = key;
- } else{
- node.rightKey = node.leftKey;
- node.leftKey = key;
- }
- return null;
- }
- K left = node.leftKey;
- K middle = key;
- K right = node.rightKey;
- if(middle.compareTo(left) < 0){
- left = key;
- middle = node.leftKey;
- } else if(middle.compareTo(right) > 0){
- right = key;
- middle = node.rightKey;
- }
- return new TreeNode<>(middle, left, right);
- }
- TreeNode<K> toFix = null;
- if(node.isTwoNode() && node.leftKey.compareTo(key) > 0){
- toFix = this.insert(node.leftChild, key);
- } else if(node.isTwoNode() && node.leftKey.compareTo(key) < 0){
- toFix = this.insert(node.rightChild, key);
- } else if(node.isThreeNode() && node.leftKey.compareTo(key) > 0){
- toFix = this.insert(node.leftChild, key);
- } else if(node.isThreeNode() && node.rightKey.compareTo(key) < 0){
- toFix = this.insert(node.rightChild, key);
- } else {
- toFix = this.insert(node.middleChild, key);
- }
- if(toFix == null) return null;
- if(node.isTwoNode()){
- if(toFix.leftKey.compareTo(node.leftKey) < 0){
- node.rightKey = node.leftKey;
- node.leftKey = toFix.leftKey;
- node.leftChild = toFix.leftChild;
- node.middleChild = toFix.rightChild;
- } else{
- node.rightKey = toFix.leftKey;
- node.middleChild = toFix.leftChild;
- node.rightChild = toFix.rightChild;
- }
- return null;
- }
- K promoteValue = null;
- TreeNode<K> left = null;
- TreeNode<K> right = null;
- if(toFix.leftKey.compareTo(node.leftKey) < 0){
- promoteValue = node.leftKey;
- left = toFix;
- right = new TreeNode<>(node.rightKey, node.middleChild, node.rightChild);
- } else if(toFix.leftKey.compareTo(node.rightKey) > 0){
- promoteValue = node.rightKey;
- left = new TreeNode<>(node.leftKey, node.leftChild, node.middleChild);
- right = toFix;
- } else{
- promoteValue = toFix.leftKey;
- left = new TreeNode<>(node.leftKey, node.leftChild, toFix.leftChild);
- right = new TreeNode<>(node.rightKey, toFix.rightChild, node.rightChild);
- }
- return new TreeNode<>(promoteValue, left, right);
- }
Add Comment
Please, Sign In to add comment