public override BinarySearchTreeNode <TKey, TValue> Search(BinarySearchTreeNode <TKey, TValue> root, TKey key)
 {
     return(Search_BST(root, key));
 }
 public override BinarySearchTreeNode <TKey, TValue> Delete(BinarySearchTreeNode <TKey, TValue> root, TKey key)
 {
     return(Delete_BST(root, key));
 }
 public override BinarySearchTreeNode <TKey, TValue> FindMax(BinarySearchTreeNode <TKey, TValue> root)
 {
     return(FindMax_BST(root));
 }
 [SpaceComplexity("O(1)", InPlace = true)] /* Notice that a new node is allocated for a new key, thus can be considered as O(Size(TreeNode))*/
 public override BinarySearchTreeNode <TKey, TValue> Insert(BinarySearchTreeNode <TKey, TValue> root, BinarySearchTreeNode <TKey, TValue> newNode)
 {
     return(Insert_BST(root, newNode));
 }
 public override bool Update(BinarySearchTreeNode <TKey, TValue> root, TKey key, TValue value)
 {
     return(Update_BST(root, key, value));
 }