I'm trying to remove items from a Binary Search Tree. I can insert numbers just fine and further working functions to find the height and size of the tree but I can't get the code removal function working.
I have figured out what I need to do merge the subtrees if necessary and set the smallest number (least item) as the new node but I'm currently unable to get it working
Thank you in advance for any help.
The code I've currently got:
Main:
static void Main(string[] args)
{
BSTree<int> testTree = new BSTree<int>();
testTree.InsertItem(6);
testTree.InsertItem(12);
testTree.InsertItem(1);
testTree.RemoveItem(12);
}
BinTree:
class BinTree<T> where T : IComparable
{
protected Node<T> root;
public BinTree()
{
root = null;
}
public BinTree(Node<T> node)
{
root = node;
}
Node:
class Node<T> where T : IComparable
{
private T data;
public Node<T> Left, Right;
public Node(T item)
{
data = item;
Left = null;
Right = null;
}
public T Data
{
set { data = value; }
get { return data; }
}
}
BSTree:
class BSTree<T> : BinTree<T> where T:IComparable
{
public BSTree()
{
root = null;
}
public void InsertItem(T item)
{
insertItem(item, ref root);
}
private void insertItem(T item, ref Node<T> tree)
{
if (tree == null)
tree = new Node<T>(item);
else if (item.CompareTo(tree.Data) < 0)
insertItem(item, ref tree.Left);
else if (item.CompareTo(tree.Data) > 0)
insertItem(item, ref tree.Right);
}
public void RemoveItem(T item)
{
removeItem(item, ref root);
}
private void removeItem(T item, ref Node<T> tree)
{
if (tree == null)
tree = new Node<T>(item);
if (item.CompareTo(tree.Data) < 0)
removeItem(item, ref tree.Left);
else if (item.CompareTo(tree.Data) > 0)
removeItem(item, ref tree.Right);
if (tree.Left == null)
tree = tree.Right;
else if (tree.Right == null)
tree = tree.Left;
T newRoot = leastItem(tree.Right);
tree.Data = newRoot;
removeItem(newRoot, ref tree.Right);
}
public T leastItem(Node<T> tree) //returns left most item in tree
{
if (tree.Left == null) //if tree.Left is empty
return tree.Data;
else
{
return leastItem(tree.Left);
}
}