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); }