public void AddItem(BSTVisualItem item)
 {
     _items.Add(item);
 }
    private GameObject Delete(GameObject node, int key)
    {
        bstVisual.Items.Add(new BSTVisualItem(node, (int)VisualType.Node));
        if (node == null)
        {
            return(node);
        }

        // key to be deleted smaller than root key --> it's in the left subtree
        if (key < node.GetComponent <NodeScript>().Key)
        {
            bstVisual.Items.Add(new BSTVisualItem(node, (int)VisualType.LeftArrow));
            node.GetComponent <NodeScript>().IsLocked = true;
            node.GetComponent <NodeScript>().LeftNode = Delete(node.GetComponent <NodeScript>().LeftNode, key);
        }
        // key greater --> right subtree
        else if (key > node.GetComponent <NodeScript>().Key)
        {
            bstVisual.Items.Add(new BSTVisualItem(node, (int)VisualType.RightArrow));
            node.GetComponent <NodeScript>().IsLocked  = true;
            node.GetComponent <NodeScript>().RightNode = Delete(node.GetComponent <NodeScript>().RightNode, key);
        }
        // key equal --> this node gets deleted
        else
        {
            // one child or no child
            if (node.GetComponent <NodeScript>().LeftNode == null)
            {
                GameObject    temp = node.GetComponent <NodeScript>().RightNode;
                BSTVisualItem item = new BSTVisualItem(node, (int)VisualType.DestroyNode, enteredKey: key, parentNode: node.GetComponent <NodeScript>().ParentNode);
                bstVisual.Items.Add(item);
                if (temp != null)
                {
                    item.TempNode = temp;
                }

                return(temp);
            }
            else if (node.GetComponent <NodeScript>().RightNode == null)
            {
                GameObject    temp = node.GetComponent <NodeScript>().LeftNode;
                BSTVisualItem item = new BSTVisualItem(node, (int)VisualType.DestroyNode, enteredKey: key, parentNode: node.GetComponent <NodeScript>().ParentNode);
                bstVisual.Items.Add(item);
                if (temp != null)
                {
                    item.TempNode = temp;
                }

                return(temp);
            }

            // node has two children --> find inorder successor, set node to inorder successor value, delete inorder successor
            bstVisual.Items.Add(new BSTVisualItem(node, (int)VisualType.InorderSuccessor));
            bstVisual.Items.Add(new BSTVisualItem(node, (int)VisualType.RightArrow));
            GameObject inorderSuccessor = InorderSuccessor(node.GetComponent <NodeScript>().RightNode);
            if (inorderSuccessor != null)
            {
                bstVisual.Items.Add(new BSTVisualItem(inorderSuccessor, (int)VisualType.InorderSuccessorFound));
                int inorderSuccessorKey = inorderSuccessor.GetComponent <NodeScript>().Key;

                Vector3 dest = node.transform.localPosition;
                //dest.y -= node.transform.localScale.y / 2;

                bstVisual.Items.Add(new BSTVisualItem(inorderSuccessor, (int)VisualType.InorderSuccessorMove, inorderPosition: inorderSuccessor.transform.localPosition,
                                                      dest: dest, enteredKey: key, parentNode: inorderSuccessor.GetComponent <NodeScript>().ParentNode, inorderKey: inorderSuccessorKey));

                bstVisual.Items.Add(new BSTVisualItem(node, (int)VisualType.SetNodeKey, enteredKey: key, inorderKey: inorderSuccessorKey));
                bstVisual.Items.Add(new BSTVisualItem(node, (int)VisualType.RightArrow));
                node.GetComponent <NodeScript>().RightNode = Delete(node.GetComponent <NodeScript>().RightNode, inorderSuccessor.GetComponent <NodeScript>().Key);
            }
        }
        return(node);
    }