private NodeForBinaryTree FindParent(int lookUpData)
        {
            var current = Root;
            NodeForBinaryTree parent = null;

            while (current != null)
            {
                if (current.Data == lookUpData)
                {
                    break;
                }

                if (lookUpData > current.Data)
                {
                    parent  = current;
                    current = current.Right;
                }
                else if (lookUpData < current.Data)
                {
                    parent  = current;
                    current = current.Left;
                }
            }
            return(parent);
        }
 private static NodeForBinaryTree FindLeftMostChild(NodeForBinaryTree current)
 {
     while (true)
     {
         if (current.Left == null)
         {
             return(current);
         }
         current = current.Left;
     }
 }
        public NodeForBinaryTree Find(NodeForBinaryTree current, int lookUpData)
        {
            while (true)
            {
                if (current == null)
                {
                    return(null);
                }

                if (current.Data == lookUpData)
                {
                    return(current);
                }

                if (lookUpData > current.Data)
                {
                    current = current.Right;
                    continue;
                }

                current = current.Left;
            }
        }
        public bool Remove(int dataNeedToRemove)
        {
            var parentOfNodeNeedsToRemove = FindParent(dataNeedToRemove);

            if (parentOfNodeNeedsToRemove != null)
            {
                var nodeNeedsToRemove = Find(parentOfNodeNeedsToRemove, dataNeedToRemove);

                // If Remove Node has Right
                // re -reference Parent of Remove Node to Remove node's left child
                if (nodeNeedsToRemove.Right == null)
                {
                    if (dataNeedToRemove >= parentOfNodeNeedsToRemove.Data)
                    {
                        parentOfNodeNeedsToRemove.Right = nodeNeedsToRemove.Left;
                    }
                    else
                    {
                        parentOfNodeNeedsToRemove.Left = nodeNeedsToRemove.Left;
                    }
                }
                else
                {
                    if (nodeNeedsToRemove.Right.Left == null)
                    {
                        nodeNeedsToRemove.Right.Left = nodeNeedsToRemove.Left;

                        if (nodeNeedsToRemove.Right.Left.Data >= parentOfNodeNeedsToRemove.Data)
                        {
                            parentOfNodeNeedsToRemove.Right = nodeNeedsToRemove.Right.Left;
                        }
                        else
                        {
                            parentOfNodeNeedsToRemove.Left = nodeNeedsToRemove.Right.Left;
                        }
                    }
                    else
                    {
                        var leftMostChild            = FindLeftMostChild(nodeNeedsToRemove);
                        var parentOfTheLeftMostChild = FindParent(leftMostChild.Data);
                        parentOfTheLeftMostChild.Left = null;
                        leftMostChild.Left            = nodeNeedsToRemove.Left;

                        if (leftMostChild.Data >= parentOfNodeNeedsToRemove.Data)
                        {
                            parentOfNodeNeedsToRemove.Right = leftMostChild;
                        }
                        else
                        {
                            parentOfNodeNeedsToRemove.Left = leftMostChild;
                        }

                        if (leftMostChild.Right != null)
                        {
                            leftMostChild.Right.Right = parentOfTheLeftMostChild;
                        }
                        else
                        {
                            leftMostChild.Right = parentOfTheLeftMostChild;
                        }
                    }
                }
                return(true);
            }

            Root = null;
            return(false);
        }
 public NodeForBinaryTree(int data, NodeForBinaryTree left, NodeForBinaryTree right)
 {
     Data  = data;
     Left  = left;
     Right = right;
 }
 public void SetRoot(NodeForBinaryTree root)
 {
     Root = root;
 }