SimeonSheytanov

2-3 Tree Insertion (C#, B-Tree)

Aug 20th, 2021
2,354
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.33 KB | None | 0 0
  1. namespace _02.Two_Three
  2. {
  3.     using System;
  4.     using System.Text;
  5.  
  6.     public class TwoThreeTree<T> where T : IComparable<T>
  7.     {
  8.         private TreeNode<T> root;
  9.  
  10.         public void Insert(T key)
  11.         {
  12.             if (this.root == null)
  13.             {
  14.                 this.root = new TreeNode<T>(key);
  15.                 return;
  16.             }
  17.             this.root = Insert(this.root, key);
  18.         }
  19.  
  20.         private TreeNode<T> Insert(TreeNode<T> node, T newElement)
  21.         {
  22.             if (node.IsLeaf())
  23.             {
  24.                 return this.MergeNewElement(node, new TreeNode<T>(newElement));
  25.             }
  26.  
  27.             TreeNode<T> returnNode;
  28.             if (newElement.CompareTo(node.LeftKey) < 0)
  29.             {
  30.                 returnNode = Insert(node.LeftChild, newElement);
  31.                 if (returnNode == node.LeftChild)
  32.                 {
  33.                     return node;
  34.                 }
  35.                 else
  36.                 {
  37.                     return this.MergeNewElement(node, returnNode);
  38.                 }
  39.             }
  40.             else if (node.IsTwoNode() || newElement.CompareTo(node.RightKey) < 0)
  41.             {
  42.                 returnNode = Insert(node.MiddleChild, newElement);
  43.                 if (returnNode == node.MiddleChild)
  44.                 {
  45.                     return node;
  46.                 }
  47.                 else
  48.                 {
  49.                     return this.MergeNewElement(node, returnNode);
  50.                 }
  51.             }
  52.             else
  53.             {
  54.                 returnNode = Insert(node.RightChild, newElement);
  55.  
  56.                 if (returnNode == node.RightChild)
  57.                 {
  58.                     return node;
  59.                 }
  60.                 else
  61.                 {
  62.                     return this.MergeNewElement(node, returnNode);
  63.                 }
  64.             }
  65.         }
  66.  
  67.         private TreeNode<T> MergeNewElement(TreeNode<T> currentNode, TreeNode<T> node)
  68.         {
  69.             if(currentNode.IsTwoNode())
  70.             {
  71.                 if (currentNode.LeftKey.CompareTo(node.LeftKey) < 0)
  72.                 {
  73.                     currentNode.RightKey = node.LeftKey;
  74.                     currentNode.MiddleChild = node.LeftChild;
  75.                     currentNode.RightChild = node.MiddleChild;
  76.                 }
  77.                 else
  78.                 {
  79.                     currentNode.RightKey = currentNode.LeftKey;
  80.                     currentNode.RightChild = currentNode.MiddleChild;
  81.                     currentNode.LeftKey = node.LeftKey;
  82.                     currentNode.MiddleChild = node.MiddleChild;
  83.                 }
  84.  
  85.                 return currentNode;
  86.             }
  87.             else if (currentNode.LeftKey.CompareTo(node.LeftKey) >= 0)
  88.             {
  89.                 var newNode = new TreeNode<T>(currentNode.LeftKey)
  90.                 {
  91.                     LeftChild = node,
  92.                     MiddleChild = currentNode
  93.                 };
  94.  
  95.                 node.LeftChild = currentNode.LeftChild;
  96.                 currentNode.LeftChild = currentNode.MiddleChild;
  97.                 currentNode.RightChild = null;
  98.                 currentNode.LeftKey = currentNode.RightKey;
  99.                 currentNode.RightKey = default;
  100.  
  101.                 return newNode;
  102.             }
  103.             else if (currentNode.RightKey.CompareTo(node.LeftKey) >= 0)
  104.             {
  105.                 node.MiddleChild = new TreeNode<T>(currentNode.RightKey)
  106.                 {
  107.                     LeftChild = node.MiddleChild,
  108.                     MiddleChild = currentNode.RightChild
  109.                 };
  110.  
  111.                 node.LeftChild = currentNode;
  112.                 currentNode.RightKey = default;
  113.                 currentNode.RightChild = null;
  114.  
  115.                 return node;
  116.             }
  117.             else
  118.             {
  119.                 var newNode = new TreeNode<T>(currentNode.RightKey)
  120.                 {
  121.                     LeftChild = currentNode,
  122.                     MiddleChild = node
  123.                 };
  124.  
  125.                 node.LeftChild = currentNode.RightChild;
  126.                 currentNode.RightChild = null;
  127.                 currentNode.RightKey = default;
  128.  
  129.  
  130.                 return newNode;
  131.             }
  132.         }
  133.  
  134.         public override String ToString()
  135.         {
  136.             StringBuilder sb = new StringBuilder();
  137.             RecursivePrint(this.root, sb);
  138.             return sb.ToString();
  139.         }
  140.  
  141.         private void RecursivePrint(TreeNode<T> node, StringBuilder sb)
  142.         {
  143.             if (node == null)
  144.             {
  145.                 return;
  146.             }
  147.  
  148.             if (node.LeftKey != null)
  149.             {
  150.                 sb.Append(node.LeftKey).Append(" ");
  151.             }
  152.  
  153.             if (node.RightKey != null)
  154.             {
  155.                 sb.Append(node.RightKey).Append(Environment.NewLine);
  156.             }
  157.             else
  158.             {
  159.                 sb.Append(Environment.NewLine);
  160.             }
  161.  
  162.             if (node.IsTwoNode())
  163.             {
  164.                 RecursivePrint(node.LeftChild, sb);
  165.                 RecursivePrint(node.MiddleChild, sb);
  166.             }
  167.             else if (node.IsThreeNode())
  168.             {
  169.                 RecursivePrint(node.LeftChild, sb);
  170.                 RecursivePrint(node.MiddleChild, sb);
  171.                 RecursivePrint(node.RightChild, sb);
  172.             }
  173.         }
  174.     }
  175. }
  176.  
Advertisement
Add Comment
Please, Sign In to add comment