public void Insert(int data)
 {
     if (root == null)
     {
         root = new TreeNode(data);
         root.ParentID = null;
         root.NodeID = AddInDB(root);
         return;
     }
     TreeNode parent = FindParent(data);
     if (data < parent.value)
     {
         parent.left = new TreeNode(data);
         parent.left.ParentID = parent.NodeID;
         parent.left.NodeID = AddInDB(parent.left);
         return;
     }
     parent.right = new TreeNode(data);
     parent.right.ParentID = parent.NodeID;
     parent.right.NodeID = AddInDB(parent.right);
     return;
 }
 public TreeNode(int i)
 {
     value = i;
     left = null;
     right = null;
 }
 public BinaryTree()
 {
     root = null;
 }
 private TreeNode RemoveRec(TreeNode root, TreeNode nodeToDelete, bool removedFromDB = false)
 {
     if (root == null)
     {
         return root;
     }
     if (nodeToDelete.value < root.value)
     {
         root.left = RemoveRec(root.left, nodeToDelete, removedFromDB);
     }
     if (nodeToDelete.value > root.value)
     {
         root.right = RemoveRec(root.right, nodeToDelete, removedFromDB);
     }
     if (nodeToDelete.value == root.value)
     {
         if (root.left == null && root.right == null)
         {
             if (!removedFromDB)
             {
                 RemoveFromDB(root, true);
             }
             root = null;
             return root;                    
         }
         else if (root.left == null)
         {
             if (!removedFromDB)
             {
                 RemoveFromDB(root, true);
             }
             root.right.ParentID = root.ParentID;
             root = root.right;
         }
         else if (root.right == null)
         {
             if (!removedFromDB)
             {
                 RemoveFromDB(root, false);
             }
             root.left.ParentID = root.ParentID;
             root = root.left;
         }
         else
         {
             TreeNode mostLeft = root.right;
             while (mostLeft.left != null)
             {
                 mostLeft = mostLeft.left;
             }
             if (!removedFromDB)
             {
                 RemoveFromDB(root, true, mostLeft);
             }
             root.value = mostLeft.value;
             root.NodeID = mostLeft.NodeID;
             root.right = RemoveRec(root.right, mostLeft, true);
             if(root.right != null)
             {
                 root.right.ParentID = root.NodeID;
             }                
             if (root.left != null)
             {
                 root.left.ParentID = root.NodeID;
             }  
         }
     }
     return root;
 }
 public void Remove(int data)
 {
     TreeNode nodeToDelete = new TreeNode(data);
     root = RemoveRec(root, nodeToDelete);
 }
        private void UpdateIDs(TreeNodeContext db, bool needRightChild, TreeNode nodeToRemove, TreeNode mostLeft)
        {
            var firstChildOfRemovingNode = needRightChild ? db.TreeNodes.SingleOrDefault(node => node.ParentID == nodeToRemove.NodeID && node.value >= nodeToRemove.value) 
                                                          : db.TreeNodes.SingleOrDefault(node => node.ParentID == nodeToRemove.NodeID && node.value < nodeToRemove.value);

            var leftChild = needRightChild ? db.TreeNodes.SingleOrDefault(node => node.ParentID == nodeToRemove.NodeID && node.value < nodeToRemove.value) : null;

            if (firstChildOfRemovingNode != null)
            {
                if(mostLeft != null)
                {
                    var mostLeftInDB = db.TreeNodes.SingleOrDefault(node => node.NodeID == mostLeft.NodeID);
                    mostLeftInDB.ParentID = nodeToRemove.ParentID;
                    if (leftChild != null)
                    {
                        leftChild.ParentID = mostLeft.NodeID;
                    }
                    if(mostLeftInDB.NodeID == firstChildOfRemovingNode.NodeID)
                    {
                        db.SaveChanges();
                        return;
                    } 
                    firstChildOfRemovingNode.ParentID = mostLeftInDB.NodeID;
                    db.SaveChanges();
                    return;
                }
                firstChildOfRemovingNode.ParentID = nodeToRemove.ParentID;
                db.SaveChanges();
            }
        }
 private void RemoveFromDB(TreeNode node, bool needRightChild, TreeNode mostLeft = null)
 {
     using (TreeNodeContext db = new TreeNodeContext())
     {
         UpdateIDs(db, needRightChild, node, mostLeft);
         var nodeToRemove = db.TreeNodes.SingleOrDefault(n => n.NodeID == node.NodeID);
         if (nodeToRemove != null)
         {
             db.TreeNodes.Remove(nodeToRemove);
         }
         db.SaveChanges();
     }
 }
 private int AddInDB(TreeNode node)
 {
     using (TreeNodeContext db = new TreeNodeContext())
     {
         db.TreeNodes.Add(node);
         db.SaveChanges();
         return node.NodeID;
     }
 }