using System.Diagnostics;
public static void Main()
const int upperBound = 10001;
var stopwatch = new Stopwatch();
var bst = new BinarySearchTree();
var numbers = Enumerable.Range(1, upperBound).ToArray();
var randomGenerator = new Random();
Shuffle(numbers, randomGenerator);
foreach (var number in numbers)
if (randomGenerator.Next(0, 100) < 50)
bst.AddUp(number, number);
Console.WriteLine("Added(up) {0} values in: {1} ms, {2} ticks", upperBound - 1, stopwatch.ElapsedMilliseconds, stopwatch.ElapsedTicks);
Shuffle(numbers, randomGenerator);
foreach (var number in numbers)
if (randomGenerator.Next(0, 100) < 50)
Console.WriteLine("Got {0} values in: {1} ms, {2} ticks", upperBound - 1, stopwatch.ElapsedMilliseconds, stopwatch.ElapsedTicks);
static void Shuffle<T>(T[] array, Random rnd)
static void Swap<T>(T[] array, int left, int right)
array[left] = array[right];
public int Key { get; set; }
public int Value { get; set; }
public int Sum { get; set; }
public Node Left { get; set; }
public Node Right { get; set; }
public Node(int key, int value, int sum)
private int Sum(Node node)
public int GetValue(int key)
return Get(Root, key).Value;
public int GetSum(int key)
return Get(Root, key).Sum;
private Node Get(Node node, int key)
return Get(node.Left, key);
return Get(node.Right, key);
public void Add(int key, int value)
Root = Add(Root, key, value);
private Node Add(Node node, int key, int value)
node = new Node(key, value, value);
node.Left = Add(node.Left, key, value);
node.Right = Add(node.Right, key, value);
node.Sum = Sum(node.Left) + Sum(node.Right) + node.Value;
public void AddUp(int key, int value)
Root = AddUp(Root, key, value);
private Node AddUp(Node node, int key, int value)
node = new Node(key, value, value);
node.Left = AddUp(node.Left, key, value);
node.Right = AddUp(node.Right, key, value);
node.Sum = Sum(node.Left) + Sum(node.Right) + node.Value;